Android内存优化工具(三)MAT

前提

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
从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
都是为了让我们以更舒服的姿势,去查看到对象的情况,算是锦上添花的功能了。
到这一步,我们应该可以入门了,可以定位到程序中的内存问题所在了。

参考

这篇文章并没有系统地介绍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

下一篇

写什么呢?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值