前提
Android优化系列
http://blog.csdn.net/mwq30123/article/category/6638876
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)
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
都是为了让我们以更舒服的姿势,去查看到对象的情况,算是锦上添花的功能了。
到这一步,我们应该可以入门了,可以定位到程序中的内存问题所在了。
参考
这篇文章并没有系统地介绍MAT功能,而是以 Dominator Tree作为切入点,快速入门。
系统的介绍可以参考:
官网 https://eclipse.org/mat/
使用Memory Analyzer tool(MAT)分析内存泄漏
http://www.blogjava.net/rosen/archive/2010/05/21/321575.html
http://www.blogjava.net/rosen/archive/2016/08/13/323522.html#431564
Android内存优化:MAT使用
http://ju.outofmemory.cn/entry/129444
http://ju.outofmemory.cn/entry/129445
下一篇
写什么呢?