MAT(Memory Analyer Tool)入门拾遗

简介: MAT是基于Eclipse的内存分析工具,MAT(Memory Analyer Tool),它是一个快速、功能丰富的Java Heap的分析工具,它可以帮助我们查找内存泄漏和排查问题,而且还有丰富的报表统计等等。我们可以通过插件的形式运行还可以单独下载,在前文中我们介绍了如何安装MAT工具,详情可以翻阅查看。

前言

image.png
MAT是基于Eclipse的内存分析工具,MAT(Memory Analyer Tool),它是一个快速、功能丰富的Java Heap的分析工具,它可以帮助我们查找内存泄漏和排查问题,而且还有丰富的报表统计等等。我们可以通过插件的形式运行还可以单独下载,在前文中我们介绍了如何安装MAT工具,详情可以翻阅查看。

模拟OOM

我们前之前介绍了JDK命令工具来生成dump文件,如果是本地调试,我们可以参数来配置生成的目录。

-Xms10m -Xmx10m -Xmn8m -XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=F:/heapdump.hprof
测试代码
// 测试代码
public static final int _MB = 1024 * 1024 ;
     
public static void main(String[] args) {
     List<Sub> strs = new ArrayList<Sub>();
     while( true ){
          strs.add(new Sub(String.valueOf(5 *_MB)));
     }
}

image.png

MAT打开快照文件

我们通过MAT工具打开File -> Open Heap Dump,打开生成的文件
image.png

MAT可疑点报表

打开之后就如下图所示,我们将其文件在MAT工具中打开。然后打开Leak Suspect(内存泄露可疑点)报表
image.png

点击完成之后,如下图所示,MAT会帮你分析出可疑的问题点所在

image.png

MAT堆栈信息

我们点击左上角的图标可以看到堆栈信息
image.png

通过MAT分析的堆栈信息,.我们可以清楚的看到那个方法,对象的占比

image.png

  • Shallow Heap(浅堆)

表示该对象自身占用的堆内存,不包括它引用的对象。针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。

  • Retained Heap(深堆)

表示当前对象大小+当前对象可直接或间接引用到的对象的大小总和。换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。不过,释放的时候还要排除被GC Roots直接或间接引用的对象。

MAT堆栈详情

我们也可以查看下详情
image.png
image.png

我们也可以在主视图面板中点击Histogram

1). Histogram可以列出内存中的对象,对象的个数以及大小。
2). Dominator Tree可以列出那个线程,以及线程下面的那些对象占用的空间。
3).Top consumers通过图形列出最大的object。
4).Leak Suspects通过MA自动分析泄漏的原因。
image.png

MAT条件筛选

image.png

可以看出来那个对象占用了多大的内存还有实例的数量

image.png
image.png

GCRoots

image.png
image.png

MAT溢出源

Exclude all phantom/weak/soft etc. reference 意思是排除虚引用、弱引用和软引用,即只剩下强引用,因为除了强引用之外,其他的引用都可以被JVM GC掉,如果一个对象始终无法被GC,就说明有强引用存在,从而导致在GC的过程中一直得不到回收,最终就内存溢出了。
image.png
image.png

还可以点击支配树视图, 在此视图中列出了每个对象(Object Instance)与其引用关系的树状结构

image.png

我们可以看到同时包含了占用内存的大小和百分比。这个对象占用了95.08%肯定是不正常的。

image.png

目录
相关文章
|
6月前
|
消息中间件 监控 Serverless
函数计算操作报错合集之显示报错:RecursionError: maximum recursion depth exceeded while calling a Python object,该如何解决
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
168 0
|
应用服务中间件
TeaVM的samples/benchmark范例运行办法
TeaVM的samples/benchmark范例运行办法
117 0
TeaVM的samples/benchmark范例运行办法
|
Java API
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
JAVA文档并发演示---并发高级对象摘录(Tutorial - Concurrency Lesson--High Level Concurrency Objects)
|
Android开发
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
312 0
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(二)
|
存储 开发工具 Android开发
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(一)
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(一)
756 0
【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( hprof 文件转换 | MAT 工具下载 | MAT 工具使用 )(一)
|
C语言
《OpenGL ES 2.0 Programming Guide》第8章 “最简单的Vertex Buffer Object”示例代码【C语言版】
《OpenGL ES 2.0 Programming Guide》第8章 “最简单的Vertex Buffer Object”示例代码【C语言版】
154 0