MAT使用

一.简介

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

 

原文地址:https://www.cnblogs.com/sy646et/p/7197958.html