1. 程式人生 > >Android記憶體優化工具(三)MAT

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,建議先操作前一篇

http://blog.csdn.net/mwq30123/article/details/53842081
從AS匯出hprof

MAT的介面,匯入hprof檔案,可以看到主介面的元素,我們從Dominator Tree開始。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
這裡寫圖片描述
結果
List Objects result

Path To GC Roots

Path To GC Roots –> exclued all phantom/weak/sofe etc. refrences
Path To GC Roots
結果
Path To GC Roots Result

Merge Shortest Paths to GC Roots

Merge Shortest Paths to GC Roots–> exclued all phantom/weak/sofe etc. refrences
Merge Shortest Paths to GC Roots
結果
這裡寫圖片描述

Java Collections

對於本例中的hprof,我們有一個List,我們可以通過Java Collections –> Extract List Values 把list的元素列出來。
這裡寫圖片描述
我的list只有一個元素。。。
Extract List Values result

總結

List object,
Path To GC Roots,
Merge Shortest Paths to GC Roots,
Java Collections
都是為了讓我們以更舒服的姿勢,去檢視到物件的情況,算是錦上添花的功能了。
到這一步,我們應該可以入門了,可以定位到程式中的記憶體問題所在了。

參考

下一篇

寫什麼呢?