MAT的使用(一)使用方法介绍

发布时间 2023-08-09 09:39:44作者: ianCloud

MAT的使用(一)使用方法介绍

1、概述
想要深入的进行分析并确定内存泄漏,就要分析 疑似发生内存泄漏时所生成堆存储文件(hprof)。堆存储文件可以使用DDMS或者Memory Monitor来生成,输出的文件格式为hpof,而MAT就是来分析堆存储文件的。

MAT,全称为Memory Analysis Tool,它是Eclipse的插件, 下载地址 : https://www.eclipse.org/mat/downloads.php。

2、生成hprof文件
hprof文件的获取要结合实际的使用场景,随便生成一个hprof文件用来分析,也只能看出对象的创建个数和内存使用情况,如果你要分析内存泄漏问题,你就要结合可能发生内存泄漏的场景来获取hprof文件,再对其进行分析。

2.1 hprof文件获取方式
1、我们可以通过Android Studio 的Profiler 来生成:


2、也可以把Leakcanary工具检测工具生成的hprof导出来

3、转换hprof的格式并用MAT打开
生成的hprof文件并不是标准的,还需要将它转换为标准的hprof文件,这样才会被MAT识别从而进行分析,可以使用SDK自带的hprof-conv进行转换,它的路径在sdk/platform-tools中,进入到该路径执行以下语句即可:

hprof-conv 转换前的文件地址 转换后的文件地址

4、用Mat打开hprof文件和常用面板介绍
用mat打开hprof文件后会看到的是一个饼状图,它主要用来显示内存的消耗,饼状图的彩色区域代表被分配的内存,灰色区域的则是空闲内存,点击每个彩色区域可以看到这块区域的详细信息,

如下图所示


其中分析内存泄漏最常用的就是Histogram和Dominator Tree,我们重点介绍这两部分。

4.1、Histogram面板介绍 ——>Histogram在类的角度上进行分析,注重量的分析。


Classe Name:类名。
Objects:对象实例的个数。
Shallow Heap:对象自身占用的内存大小,不包括它引用的对象。如果是数组类型的对象,它的大小是数组元素的类型和数组长度决定。如果是非数组类型的对象,它的大小由其成员变量的数量和类型决定。
Retained Heap:一个对象的Retained Set所包含对象所占内存的总大小。换句话说,Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存。
Regex :筛选过滤
ps:Retained Set指的是这个对象本身和他持有引用的对象以及这些引用对象的Retained Set所占内存大小的总和。

4.2、Dominator Tree 面板介绍 ——> Dominator Tree是在对象实例的角度上进行分析,注重引用关系分析

 

Classe Name:类名。
Shallow Heap:对象自身占用的内存大小,不包括它引用的对象。如果是数组类型的对象,它的大小是数组元素的类型和数组长度决定。如果是非数组类型的对象,它的大小由其成员变量的数量和类型决定。
Retained Heap:一个对象的Retained Set所包含对象所占内存的总大小。换句话说,Retained Heap就是当前对象被GC后,从Heap上总共能释放掉的内存。
Percentage:内存占比。
Regex :筛选过滤。

5、找到可疑的后,在可疑项上右击,选择Merge Shortest Paths to GC Root,然后在选择过滤掉软、弱、虚等能销毁的引用,如下图所示:


之后仅能看到详细的引用关系图了,我们就可以根据引用关系发现可能存在的问题了。


6、用Mat 对两个hprof文件进行对比
如过内存泄漏的场景比较简单,可以查看两个面板,通过类的个数和内存占用情况来找到内存泄漏的问题。但是复杂的情况就需要通过对比hpof文件来进行分析了。使用步骤为:

操作应用,生成第一个hpof文件。
进行一段时间操作,再生成第二个hpof文件。
用MAT打开这两个hpof文件。
将第一个和第二个hpof文件的Dominator Tree或者Histogram添加到Compare Basket中,如下图所示。


都添加好以后点击红色❗️

 

就可以看到Dominator Tree的对比图了,Histogram的对比同上操作。

 

这样通过前后对比更容易发下问题所在。

本次记录内容侧重内存泄漏问题的排查,Mat很多用法都没用到,大家如果熟悉其他使用方法,请大家帮忙补充完善,有错误的地方还请大家指正。
————————————————
版权声明:本文为CSDN博主「YAMgoddess」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kuankuan199308153614/article/details/123230090