MAT使用實例
使用DDMS檢查這個應用的heap使用情況。你可以使用下面的方法啟動DDMS:
From Eclipse : click Window > Open Perspective>Other...>DDMS
在左邊的面板選擇進程com.founder.android.new.kyodo.activity,然后在工具條上邊點擊heap updates按鈕。
這個時候切換到DDMS的VMHeap分頁。它會顯示每次gc后heap內存的一些基本數據。要看第一次gc后的數據內容,點擊CauseGC按鈕:
1.生成heap dump
我們現在使用heap dump來追蹤這個問題。點擊DDMS工具條上面的Dump HPROF文件按鈕,選擇文件存儲位置,然后在運行hprof-conv。
如果你使用ADT(它包含DDMS的插件)同時也在eclipse里面安裝了MAT,點擊“dump HPROF”按鈕將會自動地做轉換(用hprof-conv)同時會在eclipse里面打開轉換后的hprof文件(它其實用MAT打開)。
將生成的.hprof文件導入到MAT中,選擇Leak Suspects Report ,得到下圖:
2.用MAT分析heap dumps
啟動MAT然后加載剛才我們生成的HPROF文件。MAT是一個強大的工具,講述它所有的特性超出了本文的范圍,所以我只想演示一種你可以用來檢測泄露的方法:直方圖(Histogram)視圖。它顯示了一個可以排序的類實例的列表,內容包括:shallow heap(所有實例的內存使用總和),或者retained heap(所有類實例被分配的內存總和,里面也包括他們所有引用的對象)。
如果我們按照shallow heap排序,自從Android3.0(Honeycomb),Bitmap的像素數據被存儲在byte數組里(之前是被存儲在Dalvik的heap里),所以基于這個對象的大小來判斷。
右擊byte[]類然后選擇List Objects>with incoming references。它會生成一個heap上的所有byte數組的列表,在列表里,我們可以按照Shallow Heap的使用情況來排序。選擇并展開一個比較大的對象,它將展示從根到這個對象的路徑--就是一條保證對象有效的鏈條。
MAT不會明確告訴我們這就是泄露,因為它也不知道這個東西是不是程序還需要的,只有程序員知道。在這個案例里面,緩存使用的大量的內存會影響到后面的應用程序,所以我們可以考慮限制緩存的大小。
3.使用MAT比較heap dumps
調試內存泄露時,有時候適時比較2個地方的heap狀態是很有用的。這時你就需要生成2個單獨的HPROF文件(不要忘了轉換格式)。下面是一些關于如何在MAT里比較2個heapdumps的內容(有一點復雜):
a) 第一個HPROF文件(usingFile>OpenHeapDump).
b) 打開Histogram view.
c) 在Navigation Historyview里(如果看不到就從Window>NavigationHistory找).右擊histogram然后選擇AddtoCompareBasket.
d) 打開第二個HPROF文件然后重做步驟2和3.
e) 切換到 CompareBasketview, 然后點擊 ComparetheResults ( 視圖右上角的紅色 "!" 圖標 ) 。來自:http://blog.csdn.net/caiwenfeng_for_23/article/details/23210315