一.简介
Eclipse提供的一个内存分析工具。它是一个功能丰富的 Java 堆转储文件分析工具,可以帮助你发现内存漏洞和减少内存消耗。 Androidstudio未集成该插件,需要你下载独立版。
android studio的DDMS可以生成hprof是什么文件,不过需要进行一下格式转化(.hprof文件从Dalvik格式转换成J2SE HPROF格式),才可以导入MAT独立版软件。
可以做什么?
导入hprof文件,帮助我们进行堆转储文件分析,分析内存泄漏和大对象,可以帮助你发现内存漏洞和减少内存消耗。
二.使用流程
程序运行内存对情况——程序运行堆内存分配情况快照(ddms可以得到,文件格式为hprof)——使用MAT分析该文件——判断是否出现内存泄露——修改程序
分析流程:
通常我们都会采用下面的“三步曲”来分析内存泄露问题:
首先,对问题发生时刻的系统内存状态获取一个整体印象。
第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象
接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。
内存问题的分析, 无外乎分析对象的内存占用(Retained Size), 找出Retained Size大的对象, 找到其直接支配(Immediate Dominator), 跟踪其GC可达路径(Path to GC Roots), 从而找到是谁让这个大对象活着. 找到问题症结, 对症下药.
http://www.lightskystreet.com/2015/09/01/mat_usage/
这篇文章涉及一些分析流程,总结的很不错。
三.工作台
1.histogram(直方图,柱状图)
histogram视图主要是查看某个类的实例个数,比如我们在检查内存泄漏时候,要判断是否频繁创建了对象,就可以来看对象的个数来看。也可以通过排序看出占用内存大的对象:
默认是类名形式展示,你也可以选择不同的显示方式,有以下四种方式:
以下文章中有这个的实践
https://juejin.im/post/58eb814aac502e4957ce3073
2.dominator tree(内存里占用内存最多的对象列表)
该视图会以占用总内存的百分比来列举所有实例对象,注意这个地方是对象而不是类了,这个视图是用来发现大内存对象的。这些对象都可以展开查看更详细的信息,可以看到该对象内部包含的对象:
默认是类名形式展示,你也可以选择不同的显示方式,有以下四种方式:
-
Shallo Heap:对象本身占用内存的大小,不包含其引用的对象内存。
-
Retained Heap: Retained heap值的计算方式是将retained set中的所有对象大小叠加。或者说,由于X被释放,导致其它所有被释放对象(包括被递归释放的)所占的heap大小。
通过List objects->with incoming references查看(这里with incoming references表示查看谁引用了这个对象,with outgoing references表示这个对象引用了谁)
with incoming references 将列出哪些类引入该类;
with outgoing references 列出该类引用了哪些类
腾讯下面的文章有介绍它的实践,主要基于dominator tree。
Android 内存优化总结&实践
https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ
leakcanary原理分析与AppsFly内存泄漏
http://www.voidcn.com/blog/ahong222/article/p-6171643.html
定位bitmap后,怎么看出是哪张图片?
http://androidperformance.com/2015/04/11/AndroidMemory-Open-Bitmap-Object-In-MAT.html
http://hoo.tips/2017/04/08/841651a1/
3.duplicate class(重复类)
4.leak suspects(泄漏嫌疑)
这个视图会展示一些可能的内存泄漏的点.
5.top components(top 成分)
Top consumers通过图形列出最大的object。
6.使用OQL查询相关对象
对于Android App开发来说, 大部分的内存问题都跟四大组件, 尤其是Activity相关, 故而我们会想查出所有Activity实例的内存占用情况, 可以使用OQL来查询:
四.实践
见以上
五.参考资料
使用 Eclipse Memory Analyzer 进行堆转储文件分析
https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html
内存泄露实例分析 – Android内存优化第四弹
http://blog.lmj.wiki/2016/10/31/app-opti/app_opt_mem_leak/
Android内存优化之三:打开MAT中的Bitmap原图
http://androidperformance.com/2015/04/11/AndroidMemory-Open-Bitmap-Object-In-MAT.html
Android 性能优化之内存泄漏检测以及内存优化(中)
https://juejin.im/post/58eb814aac502e4957ce3073
MAT使用教程
http://blog.csdn.net/itomge/article/details/48719527
MAT - Memory Analyzer Tool 使用进阶
http://www.lightskystreet.com/2015/09/01/mat_usage/
之前自己的一篇文章: android内存泄露分析工具MAT详解
http://blog.csdn.net/a910626/article/details/50760948
Android性能专项测试之MAT
http://www.woaipu.com/shops/zuzhuan/61406
http://www.znds.com/tv-967956-1-1.html
http://www.znds.com/tv-967958-1-1.html
http://www.woaipu.com/shops/zuzhuan/61406
http://www.znds.com/tv-967956-1-1.html
http://www.znds.com/tv-967958-1-1.html