1. 程式人生 > >android記憶體分析工具- MAT的初識(1)

android記憶體分析工具- MAT的初識(1)

目標:該系列文章帶領大家掌握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找到相關的類。
這裡寫圖片描述