Android應用記憶體洩露分析 改善經驗總結

2021-07-14 23:18:19 字數 1120 閱讀 3429

通過這幾天對好幾個應用的記憶體洩露檢測和改善,效果明顯:

從結果來看我分析和改善記憶體洩露的方法是對的,這個過程並不複雜,所以可以梳理總結出來作為分享。

對於效能問題,分析和改善有必要遵循以下原則:

下面是我在針對記憶體洩露這個效能問題上的解決步驟:

首先解決常見的記憶體洩露問題,這個過程可以借助android studio的analyze-inspect code對**做靜態分析,常見的記憶體洩露問題有:

備註:大家注意看到有一些no上新增了一些數字,其實這些從能力上來說是yes,但是為什麼說是no呢?下面乙個乙個解釋:

1、數字1:啟動activity在這些類中是可以的,但是需要建立乙個新的task,一般情況不推薦;

2、數字2:在這些類中去layout inflate是合法的,但是會使用系統預設的主題樣式,如果你自定義了某些樣式可能不會被使用;

3、數字3:在receiver為null時允許,在4.2或以上的版本中,用於獲取黏性廣播的當前值。(可以無視);

4、contentprovider、broadcastreceiver之所以在上述**中,是因為在其內部方法中都有乙個context用於使用。

1、ui只提供一套高解析度的圖,建議放在drawable-xxhdpi資料夾下(放在***hdpi或者更高解析度的資料夾下沒有必要,權衡利弊,照顧主流裝置即可),這樣在低解析度裝置中的大小只是壓縮,不會存在記憶體增大的情況;

2、涉及到桌面外掛程式或者不需要縮放的,放在drawable-nodpi資料夾下,這個資料夾下的在任何裝置上都是不會縮放的。

通過上面的步驟,應用中的大部分記憶體洩露問題都能夠得到解決,還有一些記憶體洩露,需要執行程式,分析執行後的記憶體快照來解決,比如註冊之後沒有反註冊、類中的靜態成員變數導致的記憶體洩露、sdk中的記憶體洩露等。解決這類問題可以分兩步進行:

根據個人經驗,我一般是這樣驗證改善效果的,執行程式,各個功能跑一遍,確保沒有改出問題,完全退出程式,手動觸發gc,然後通過adb shell dumpsys meminfo packagename -d檢視activivites和views的數量是否趨近於0;如果不是0,通過leakcanary檢查可能存在記憶體洩露的地方,繼續通過mat分析,周而復始,改善到自己滿意為止。

張明雲,

Android記憶體洩露

android應用記憶體洩漏的的原因有以下幾個 1查詢資料庫後沒有關閉游標cursor 2 構造adapter時,沒有使用 convertview 重用 3 bitmap物件不在使用時呼叫recycle 釋放記憶體 4 物件被生命週期長的物件引用,如activity被靜態集合引用導致activity...

android 記憶體洩露

記憶體洩露情況 1 使用單例導致記憶體洩露 public class singleton public static singleton getsingleton context context return singleton 原因 靜態的單例使它的生命週期與應用的生命週期一樣長,context一...

記憶體洩露分析

記憶體洩露分析demo gflags標誌設定好後,開啟cmd 鍵入要定位記憶體洩露的程式gflags.exe i memroyleak.exe 程式名稱 ust 如圖成功後,開啟memoryleak.exe程式 命令格式 umdh pn memoryleak.exe 程式名稱 f snap1.log...