Android記憶體洩漏

竹_間發表於2018-03-11

Android記憶體洩漏
可達性分析演算法中,通過一系列的gc root為起始點,從一個GC ROOT開始,尋找對應的引用節點,找到這個節點以後,繼續尋找這個節點的引用節點,當所有的引用節點尋找完畢之後,剩餘的節點則被認為是沒有被引用到的節點,即無用的節點。 java中可作為GC Root的物件有   1.虛擬機器棧(本地變數表)中正在執行使用的引用   2.方法區中靜態屬性引用的物件   3. 方法區中常量引用的物件 4.本地方法棧JNI中引用的物件(Native物件) 上圖中objD與objE到GC ROOT不可達,所以可以被回收。而其他的對gc root可達。

記憶體洩漏原因是:長生命週期的物件擁有短生命週期物件的引用,本該回收的物件因為引用問題無法回收。

記憶體洩漏常見原因: 1、集合類
2、靜態成員,常量
3、單例模式
4、未關閉釋放的資源
5、Handdler/Thread 非靜態內部類

記憶體洩漏排查: 步驟1:

Android記憶體洩漏
步驟2:

Android記憶體洩漏

進入app後到處多點幾次,可以使用monkey測試。

步驟3 4:

Android記憶體洩漏
步驟5:這裡我們知道哪幾個物件存在記憶體洩漏的問題

Android記憶體洩漏

步驟6:使用SDK工具platform-tools/hprof-conv.exe 把 a.hprof 編譯為 a_mat.hprof

Android記憶體洩漏
Android記憶體洩漏

步驟7:使用Eclipse外掛開啟a_mat.hprof 下載連結:https://www.eclipse.org/mat/downloads.php

Android記憶體洩漏
步驟8:
Android記憶體洩漏
步驟9:

Android記憶體洩漏
Android記憶體洩漏
步驟10:

Android記憶體洩漏

步驟11:在AS中AddfriendActivity中檢視關於BaseApp的引用

Android記憶體洩漏
然而AddFriendActivity中程式碼並沒有找到有關BaseApp,繼續BaseActivity中找
Android記憶體洩漏
Android記憶體洩漏
MyApp 繼承BaseApp
Android記憶體洩漏

步驟12:解決問題

Android記憶體洩漏

Android記憶體洩漏

記憶體洩漏排查和修復就到這裡,更多的是需要自己細心去找。

相關文章