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很多用法都没用到,大家如果熟悉其他使用方法,请大家帮忙补充完善,有错误的地方还请大家指正。

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MAT工具使用说明.docx MAT(Memory Analyzer Tool)工具入门 一MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。 二 使用MAT意义 当服务器应用占用了过多内存的时候,会遇到OutOfMemoryError。如何快速定位问题呢?Eclipse MAT的出现使这个问题变得非常简单。它能够离线分析dump的文件数据。 四 MAT操作流程 1先调用jdk的工具得到heap使用情况 我安装的是jdk1.6 C:/>java -version java version "1.6.0_11" Java(TM) SE Runtime Environment (build 1.6.0_11-b03) Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) 2调用jdk工具jps查看当前的java进程 C:/>jps 3504 Jps 3676 Bootstrap 3496 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar 3调用jmap工具得到信息 C:/>jmap -dump:format=b,file=heap.bin 3676 Dumping heap to C:/heap.bin ... Heap dump file created 这时,我们的C盘根目录,就生成了heap.bin文件。 4用eclipse的file---->open打开这个文件,首先是一个启动图: 这里可以选择查看 (1)内存泄露报表,自动检查可能存在内存泄露的对象,通过报表展示存活的对象以及为什么他们没有被垃圾收集; (2)对象报表,对可颖对象的分析,如字符串是否定义重了,空的collection、finalizer以及弱引用等。 我这里选择的是查看内存报表,以下是截的简略图: 通过报表展示,蛮清楚的,下面还有详细的说明,这里就没有帖图了,有兴趣的可以继续探究。
OpenCV是一个基于开源许可的计算机视觉库,它包含了许多用于图像处理和计算机视觉的函数和类。在OpenCV中,Mat是一个非常重要的类,用于存储和处理图像数据。下面是关于OpenCV 4.x中Mat类的详细介绍Mat类是OpenCV中用于存储和处理图像数据的主要类,它是一个多维数组,可以表示单通道或多通道、灰度或彩色图像。Mat类中的数据可以在内存中连续或不连续存储,可以是有符号整数、无符号整数、浮点数等类型,支持大多数的像素格式。 在OpenCV中,Mat是一个模板类,可以根据需要定义不同类型的Mat对象。Mat类的构造函数有多个参数,包括行数、列数、数据类型等。可以使用Mat::zeros()函数和Mat::ones()函数来创建指定大小的全零或全一矩阵。还可以使用Mat::eye()函数来创建单位矩阵。 Mat类提供了许多用于操作图像的函数和方法,例如Mat::rows()和Mat::cols()方法可以返回Mat对象的行数和列数;Mat::at()方法可以访问Mat对象的指定像素点;Mat::clone()方法可以复制一个Mat对象;Mat::convertTo()方法可以将Mat对象的数据类型转换为指定类型;Mat::reshape()方法可以改变Mat对象的形状等。 Mat类还支持与其他Mat对象之间的运算,例如加、减、乘、除等。可以使用MatExpr类来表示这些运算,例如MatExpr e = Mat1 + Mat2;表示将Mat1和Mat2进行加法运算,得到一个MatExpr对象e。还可以使用Mat::operator()方法来对Mat对象进行切片和子矩阵操作。 总之,OpenCV中的Mat类是一个非常重要的类,它提供了许多用于图像处理和计算机视觉的功能和方法,可以帮助开发者更方便地进行图像处理和计算机视觉的开发工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值