Android記憶體優化工具(三)MAT
前提
MAT介紹和獲取
官網https://eclipse.org/mat/
Memory Analyzer (MAT)是一個Java堆分析器,分析hprof檔案,檢視記憶體中都要哪些物件,都佔用了多少記憶體,檢視誰阻止Garbage Collector收集物件。
MAT是個古老的工具了,android studio中的HPROF Viewer 與MAT非常相似。
官網下載: https://eclipse.org/mat/
或者百度雲:https://pan.baidu.com/s/1pL1z6ht
匯入hprof檔案
Android Studio 生成的hprof檔案,不能直接供MAT使用,AS可以匯出MAT可使用的hprof檔案,如下:
(這裡用的是前一篇文章中生成的hprof,建議先操作前一篇
MAT的介面,匯入hprof檔案,可以看到主介面的元素,我們從Dominator Tree開始。
Dominator Tree
Dominator Tree 介面
Dominator Tree可以說是最直接的模組了。它列出了記憶體中的所有物件,從物件的角度,檢視大小和引用情況。
主介面如上圖,很醒目的就能看到,我們自己的類 MemoryCaseActivity物件。我們一層層展開它,發現了我們Decode出來的Bitmap。層級結構一清二楚,太好用了!!!
而且Object list 可以 通過一下方法變換各種姿勢檢視,很隨性。
- 過濾 ,輸入”Memory”,試試,可以迅速定位到我們自己的類物件
- 分組,按物件,類,包分組等等
- 排序,從大到小,從小到大
關於shallow size、retained size
Shallow size就是物件本身佔用記憶體的大小,不包含對其他物件的引用,也就是物件頭加成員變數(不是成員變數的值)的總和。
Retained size是該物件自己的shallow size,加上從該物件能直接或間接訪問到物件的shallow size之和。換句話說,retained size是該物件被GC之後所能回收到記憶體的總和。
具體的可以看這:http://www.blogjava.net/rosen/archive/2010/05/21/321575.html
經典功能
如果覺得頁面上的物件太多,可以右鍵點選某個物件,出現下面功能,查個某個物件的記憶體大小和引用路徑
List object
我們操作 List Objects–> with incoming refrences
結果
Path To GC Roots
Path To GC Roots –> exclued all phantom/weak/sofe etc. refrences
結果
Merge Shortest Paths to GC Roots
Merge Shortest Paths to GC Roots–> exclued all phantom/weak/sofe etc. refrences
結果
Java Collections
對於本例中的hprof,我們有一個List,我們可以通過Java Collections –> Extract List Values 把list的元素列出來。
我的list只有一個元素。。。
總結
List object,
Path To GC Roots,
Merge Shortest Paths to GC Roots,
Java Collections
都是為了讓我們以更舒服的姿勢,去檢視到物件的情況,算是錦上添花的功能了。
到這一步,我們應該可以入門了,可以定位到程式中的記憶體問題所在了。
參考
下一篇
寫什麼呢?