二、Android效能優化之記憶體洩露分析及工具使用

kpioneer123發表於2018-01-18

######App在某個時候或者某個操作以後會出現很卡的現象,就需要分析記憶體使用情況

Android Studio中 Monitors等工具

在Memory視窗的左邊有四個按鈕,分別是: Enabled(藍色的開關):就是一個正常的開關功能 Initiate GC(橙色小卡車):就是手動呼叫GC,我們在抓記憶體前,一定要手動點選 Initiate GC按鈕手動觸發GC,這樣抓到的記憶體使用情況就是不包括Unreachable物件的(Unreachable指的是可以被垃圾回收器回收的物件,但是由於沒有GC發生,所以沒有釋放,這時抓的記憶體使用中的Unreachable就是這些物件) Dump Java Heap(紫色帶向下的箭頭):獲取hprof檔案(hprof檔案是我們使用MAT工具分析記憶體時使用的檔案),但這裡直接產生的檔案MAT還不能直接使用,需用轉換成標準的hprof檔案。可以使用AndroidStudio轉換或者用hprof-conv命令轉化,網上可以查到。 Start Allocation Tracking(紫色帶圓圈):開始分配追蹤,第一次點選可以指定追蹤記憶體的開始位置,第二次點選可以結束追蹤的位置。這樣我們擷取了一段要分析的記憶體,等待幾秒鐘AndroidStudio會給我們開啟一個Allocation檢視(感覺和MAT工具差不多,不過MAT工具更加強大,我們也可以獲取hprof檔案,使用MAT來分析)例如下圖:

Paste_Image.png

開啟Android Studio,編譯程式碼,執行掌上道聚城,然後開始盡情的耍我們的App啦,然後就從Memory Monitor裡面觀察App的記憶體使用曲線,突然發現,納尼!!!怎麼記憶體使用越來越大了,這就很有可能是發生記憶體洩漏了,然後點選

二、Android效能優化之記憶體洩露分析及工具使用
手動進行GC,再點選
二、Android效能優化之記憶體洩露分析及工具使用
觀看JavaHeap,點選Analyzer Task,Android Monitor就可以為我們自動分析洩漏的Activity啦,分析出來如下圖所示

發生異常的Activity

怎樣查詢出出問題的程式碼? 找出所有引用了該物件的外部物件,然後一個一個排查,查詢可能記憶體洩露的嫌疑犯,依據:看(讀程式碼和猜)他們的生命週期是否一致(可以通過快照對比),如果生命週期一致了肯定不是元凶。

shallow heap 物件本身佔用記憶體的大小(單位b)

Eclipse MAT記憶體分析工具 1 首先在eclipse官網下載MAT工具 www.eclipse.org/mat/ 2 下載完MAT並安裝好之後,需要先生成hprof檔案。 這兩我還是使用之前執行緒造成記憶體洩漏的案例來演示, 首先第一次開啟MainActivity時,點選dump heap生成一個hprof檔案 其次進行一系列的操作, 比如點選Button,按下返回鍵,再次進入MainActivity等等,這裡我重複了4遍如上操作,然後再點選dump heap生成hprof檔案

3 點選Studio的Captures欄,顯示剛才生成的hprof檔案,如下圖所示:

7X}_$TL`Y7YNTIRQQ%4$4DI.png
4 使用MAT開啟轉換後的hprof檔案,顯示如下圖

MAT開啟hprof檔案的顯示

Histogram項將得到 Histogram結果:

利用Histogram分析

它按類名將所有的例項物件列出來,可以點選表頭進行排序,在表的第一行可以輸入正規表示式來匹配結果 :

二、Android效能優化之記憶體洩露分析及工具使用

在Histogram中,可以右鍵某一想檢視的物件,然後選中List Objects來檢視此物件的所有例項,如下圖

二、Android效能優化之記憶體洩露分析及工具使用

分析MainActivity被誰引用

排除一些容易被回收的(軟引用、虛引用、弱引用)

選中之後,會跳出所有例項物件皮膚,在此皮膚中可以可以繼續某一特定例項在記憶體中的Path To GC Root(從GC開始的強引用)

Paste_Image.png

exclude all phantom/weak/soft的意思是講所有的虛引用/軟引用/弱引用都排除掉,因為只有強引用才會造成記憶體洩漏!點選之後顯示下圖資訊:

篩選後可疑引用

Histogram 對比

為查詢記憶體洩漏,通常需要兩個 Dump結果作對比,開啟 Navigator History皮膚,將兩個表的 Histogram結果都新增到 Compare Basket中去 :

二、Android效能優化之記憶體洩露分析及工具使用

也可以將兩個histogram檔案進行比較

點選紅色感嘆號得出對比結果:

二、Android效能優化之記憶體洩露分析及工具使用

注意,上面這個對比結果不利於查詢差異,可以調整對比選項:

二、Android效能優化之記憶體洩露分析及工具使用
再把對比的結果排序,就可得到直觀的對比結果:
直觀的對比結果

特別感謝: 紫璐宇的專欄 zxm317122667的專欄 動腦學院Ricky

相關文章