android記憶體分析工具- MAT的初識(1)
阿新 • • 發佈:2019-01-08
目標:該系列文章帶領大家掌握android記憶體溢位的排查,讓記憶體問題不再是android開發者的門檻。
DDMS(Dalvik Debug Monitor Server)和MAT(Memory Analyzer Tool)這兩個工具可以很好地幫助我們分析優化記憶體。MAT是一個Eclipse外掛,同時也有單獨的RCP客戶端。我們使用MAT的eclipse外掛,使用外掛要比RCP稍微方便一些。外掛地址為http://download.eclipse.org/mat/1.5/update-site/,安裝方式跟ADT,SVN外掛方式一致。
一,MAT的使用
1) 手機連線電腦,點選eclipse DDMS檢視,選擇Devices檢視,確認手機在Devices列表中。
2 在手機上開啟應用,執行至需要分析記憶體的介面,在Devices中對應手機下選中該應用對應的包名,比如com.tencent.kupaodemo,先後點選如下圖:
3)點選步驟2)中的2之後稍等數秒,如果已成功安裝MAT,便會自動開啟hprof檔案,進入以下介面:
上圖我們最常用的兩個MAT功能是:Histogram(直方圖)列舉了每個物件的統計,Dominator Tree(支配樹)提供了程式中最佔記憶體的物件的排列。
二,MAT工具的介紹
1)點選Dominator Tree,顯示如下介面:
Dominator Tree可以列出分配的所有對像。
下面認識一下上圖紅框標註的幾個名詞含義:
Shallow Heap:指物件自身所佔用的記憶體大小,不包含其引用的物件所佔的記憶體大小。單位為byte。
Retained Heap:前物件大小+當前物件可直接或間接引用到的物件的大小總和。(間接引用的含義:A->B->C, C就是間接引用)。換句話說,Retained Size就是當前物件被GC後,從Heap上總共能釋放掉的記憶體。單位為byte。
在JAVA中是通過可達性(Reachability Analysis)來判斷物件是否存活,這個演算法的基本思想是通過一系列的稱謂”GC Roots”的物件作為起始點,從這些節點開始向下搜尋,搜尋所走的路徑稱為引用鏈,當一個物件到GC Roots沒有任何引用鏈相連則該物件被判定為可以被回收的物件,反之不能被回收。
右鍵點選某個對像,點Path to GC root->exclude weak/soft reference. 可以列出這個對像到GC root的路徑。如下圖所示:
下圖顯示這個NinePatch(點九圖片)物件到GC-root的路徑
2)點選Histogram,顯示如下介面:
Histogam可以列出程式涉及的所有class。
Histogram檢視,以class為分類進行統計,並統計每個class分配了多少物件,佔用的shallow size和retain size。
右鍵點選某一個類-> list objects可以列出這個類生成的所有物件。如下圖:
with outgoing reference表示,把此物件引用的物件也顯示出來。
with incoming referentce 表示,把引用此物件的物件也顯示出來。
3)Group by…
在historgam和dominator tree檢視中,可以點選選單欄的“Group by..”按鈕。可以將對像以四種方式分類1.Group by class,實際上就是Hisgtoram檢視。
2.Group By class loader 其中在Group By class loader中。會按照class loader進行分類。
3.GroupByPackage
在Group By Package中。可以將類以包名組積顯示,結構和我們寫程式時看到的Package Explorer相似。如下圖所示。在這個檢視中,可以很方便的根據我們熟悉的Package explorer找到相關的類。