標籤:help 手機 targe java short 虛擬機器 tom hdr res
Overview
MAT(Memory Analyzer Tool) 是一個JAVA Heaper分析器,可以用來分析記憶體泄露和減少記憶體消耗。分析Process showmap中的/dev/ashmem/dalvik-heap(deleted)一項所佔用的Memory.可以參考我寫的使用showmap分析系統記憶體佔用情況一文。
下面就將一下如何使用Eclipse MAT分析Android應用程式記憶體的消耗。所需要的是已經安裝ADT和SDK的Eclipse.然後可以在http://www.eclipse.org/mat/ 下載MAT外掛程式將MAT安裝在Eclipse上。
如所示,手機串連電腦,開啟Eclipse,進入DDMS中,選擇一個進程,可以看到下面的
畫面:
update Heap鍵的作用是立即更新,使工具可以獲得手機上啟動並執行Android應用程式的最新Heap分配狀況。dump Hprof鍵則可以立即dump Hprof檔案(Java Heap 分配資訊儲存在Hprof檔案中)。 Cause GC鍵主要就是強制引發一次GC(記憶體回收)。
點擊dump Heap鍵,我們會看到如下畫面:
這個就是Eclipse中Hprof檔案分析介面的首頁面了。
其中Histogram可以看到所有執行個體的分配情況, Dominator Tree列出了堆的最大對象。 Leak Suspects主要是列出懷疑的記憶體泄露處。
Histogram
首先,我們來看一下Histogram,
這個列出了所有執行個體類型,右鍵選中執行個體類型Byte,選擇Merge Shortest Paths to GC Root,然後選擇excluse all phantom/weak/soft etc refereneces. Merge Shortest Paths to GC Root主要顯示最短離GC Root的路徑。Java的記憶體回收機制簡單來說有點類似樹的深度遍曆方式,如果一個對象有引用,則GC Root到這個對象之間是有路徑可達的。如果GC Root到 這個對象之間無任何路徑可達,則這個對象是不可觸及的,是可以回收的。exclude all phantom/weaker/soft etc references則是排除虛引用,弱引用及軟引用。因為這些引用一般是可以回收的。 (詳細解釋請參考深入Java虛擬機器 記憶體回收一章)。
然後可以可以看到如下畫面:
其中可以看到Resources類中有個sPreloadedDrawables的LongSparseArray對象,sPreloadedDrawables中有個mValues的Object數組,數組第139個個元素是一個NiePatchDrawable的對象,這個對象有個mNinePatch的對象,mNinePatch則有一個mChunk的Byte數組的引用。
可能大家已經注意到圖中有個Shallow heap和Retained Heap, 具體代表什麼意思呢?簡單來講,Shallow Heap Size是對象自身佔用的Size。 Retained Heap Size是對象自身的Shallow Size +對象直接引用或者間接引用的對象的Shallow Size。
然後結合代碼可以分析出來這個Byte數組是如何引用的,以及這個Byte數組是什麼時候建立和銷毀的,其建立和銷毀是否是合理的。
假如說上面對象此時本來應該是被GC掉的,那麼我們應該如何處理了。簡單的辦法就是將其中的某處置為null或者remove掉,使其到GC Root無路徑可達,處於不可觸及狀態,記憶體回收行程就可以回收了。
由於有很多個物件,為了分析方便,我們可以點擊Cause GC鍵使其強制發生一次GC,這樣可以減少對象的個數,便於我們分析。
Leak Suspects
Leak Suspects列出了工具懷疑的記憶體泄露點。
在中,MAT工具懷疑第一個問題有1.5M的記憶體泄露:
然後接著,是問題一的描述,列出了一些比較大的執行個體。
點擊Details可以看到細節資訊。
不過工具懷疑的也未必真的是存在的,但提供了一種參考。
參考:http://help.eclipse.org/kepler/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html
http://www.eclipse.org/mat/about/screenshots.php
http://plumbr.eu/blog/how-much-memory-do-i-need-part-2-what-is-shallow-heap
http://joeylittlefat.diandian.com/post/2011-09-27/5340625
使用MAT分析Java記憶體