掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
前言

通過這幾天對好幾個應(yīng)用的內(nèi)存泄露檢測和改善,效果明顯:
從結(jié)果來看我分析和改善內(nèi)存泄露的方法是對的,這個過程并不復(fù)雜,所以可以梳理總結(jié)出來作為分享。
原則
對于性能問題,分析和改善有必要遵循以下原則:
步驟
下面是我在針對內(nèi)存泄露這個性能問題上的解決步驟:
優(yōu)先處理常見的內(nèi)存泄露問題
首先解決常見的內(nèi)存泄露問題,這個過程可以借助Android Studio的Analyze-Inspect Code對代碼做靜態(tài)分析,常見的內(nèi)存泄露問題有:
- static class ExerciseHandler extends Handler{
- private SoftReference
exerciseActivitySoftReference = null; - public ExerciseHandler(ExerciseActivity exerciseActivity){
- exerciseActivitySoftReference = new SoftReference
(exerciseActivity); - }
- @Override
- public void handleMessage(Message msg) {
- ExerciseActivity exerciseActivity = exerciseActivitySoftReference.get();
- if(null != exerciseActivity){
- super.handleMessage(msg);
- switch (msg.what) {
- case MSG_XX:
- exerciseActivity.***;
- break;
- default:
- break;
- }
- }
- }
- }
application使用場景
備注:大家注意看到有一些NO上添加了一些數(shù)字,其實這些從能力上來說是YES,但是為什么說是NO呢?下面一個一個解釋:
1、數(shù)字1:啟動Activity在這些類中是可以的,但是需要創(chuàng)建一個新的task,一般情況不推薦;
2、數(shù)字2:在這些類中去layout inflate是合法的,但是會使用系統(tǒng)默認(rèn)的主題樣式,如果你自定義了某些樣式可能不會被使用;
3、數(shù)字3:在Receiver為null時允許,在4.2或以上的版本中,用于獲取黏性廣播的當(dāng)前值。(可以無視);
4、ContentProvider、BroadcastReceiver之所以在上述表格中,是因為在其內(nèi)部方法中都有一個context用于使用。
還有一種不屬于內(nèi)存泄露,但在分析內(nèi)存泄露的問題時應(yīng)該一并解決:同一個APP,將圖片放在不同的drawable文件夾下,在相同的設(shè)備上占用的內(nèi)存情況不一樣,具體可以參見:關(guān)于Android中圖片大小、內(nèi)存占用與drawable文件夾關(guān)系的研究與分析。解決這個問題遵循以下原則就可以了:1、UI只提供一套高分辨率的圖,圖片建議放在drawable-xxhdpi文件夾下(放在xxxhdpi或者更高分辨率的文件夾下沒有必要,權(quán)衡利弊,照顧主流設(shè)備即可),這樣在低分辨率設(shè)備中圖片的大小只是壓縮,不會存在內(nèi)存增大的情況;2、涉及到桌面插件或者不需要縮放的圖片,放在drawable-nodpi文件夾下,這個文件夾下的圖片在任何設(shè)備上都是不會縮放的。
通過工具檢查程序運行后的內(nèi)存泄露
通過上面的步驟,應(yīng)用中的大部分內(nèi)存泄露問題都能夠得到解決,還有一些內(nèi)存泄露,需要運行程序,分析運行后的內(nèi)存快照來解決,比如注冊之后沒有反注冊、類中的靜態(tài)成員變量導(dǎo)致的內(nèi)存泄露、SDK中的內(nèi)存泄露等。解決這類問題可以分兩步進(jìn)行:
備注:在Android Studio中,可以通過如下方式獲取當(dāng)前選中進(jìn)程的內(nèi)存信息:
驗證改善效果
根據(jù)個人經(jīng)驗,我一般是這樣驗證改善效果的,運行程序,各個功能跑一遍,確保沒有改出問題,完全退出程序,手動觸發(fā)GC,然后通過adb shell dumpsys meminfo packagename -d查看Activivites和Views的數(shù)量是否趨近于0;如果不是0,通過Leakcanary檢查可能存在內(nèi)存泄露的地方,繼續(xù)通過MAT分析,周而復(fù)始,改善到自己滿意為止。
推薦閱讀

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流