1.首先我们通过下面的一个示例代码产生一个OutOfMemoryError时对应的dump文件
/**
*
*/
package simple.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author: 作者: chengaofeng
* @date: 创建时间:2018-09-11 16:50:59
* @Description: TODO
* @version V1.0
*/
public class MatSimple {
public static void main(String[] args) {
PersonRepo pp = new PersonRepo();
pp.autoCreatePerson(10000000);
}
public static class PersonRepo {
private List<Person> repo = new ArrayList<>();
public void autoCreatePerson(long count) {
for (long l = 0; l < count; l++) {
repo.add(new Person(l));
}
}
}
public static class Person {
private long num;
/**
* @param num
*/
public Person(long num) {
this.num = num;
}
public long getNum() {
return this.num;
}
}
}
我们通过在eclipse中配置运行参数的形式获取对应的dump
执行run,很快在控制台中会出现异常以及生成dump文件的信息
2.利用MAT打开dump文件 File > Open Heap Dump...
默认情况会让选择一个报告模式,可以跳过,也可以选择任意一个选择finish,之后进入Overview界面
2.1 Overview
在右侧的窗口的details分类下可找到dump的大小,类、对象、以及类加载器的个数。
接下来的饼图中列出了dump中的大对象,一般情况下当某一类对象占用的特别多时就是程序有内存泄漏的可能了。当鼠标滑过一个饼图中的一个分类时在右侧会显示详细信息,点击在弹出菜单中可进一步对这一类对象进行分析。
2.2 Histogram
通过工具栏中的Histogram按钮或者在Overview界面的action中选择Histogram可以打开Histogram界面。
通过Histogram可以看到每类对象的个数以及
shallow size 和 retained size .
在这个页面,我们已经很明确看出来,现在dump中主要是存储了大量的simple.test.MatSimple$Person对象(1,215,488个,占用了快30M的内存)对于我们的测试应用来说已经能发现是对Person对象的处理有问题造成了内存泄漏。
在这个页面我们可以对任何有疑问的对象做进一步分析
或者对对象分组排序等操作
例如按package排序后很容易就能看出是哪个package中的类占用的内存比较多
2.3 Dominator Tree
通过工具栏中的
Dominator Tree按钮或者在Overview界面的action中选择Dominator Tree可以打开Dominator Tree界面。
Dominator Tree列出了dump中所有占用内存大的对象。Dominator Tree在分析dump中哪个对象保持其他对象存活方面非常强大。并且也可以用package、class loader来排序
通过这个图,我们可以看到,在我们的例子中,主线程中保留了一个Person对象数组(list的底层实现是一个数组),里面保存了1,215,462个person对象,因为main tread无法被GC,造成大量的person对象无法被GC,即问题是出在主线程的一个存储Person对象的数组(list)中的。继而我们就可以发现代码问题了。
2.4 Path to GC Roots
GC Roots指的是那些被jvm保持存活状态的对象,通过分析一个对象到GC Roots的路径,可以更加清楚的看到是因为什么原因造成此对象在内存中一直存活的,即一个对象为什么没有被GC回收,在Dominator Tree界面选中人意我们想分析的对象,点击
可以看到我们的person对象是作为一个Object存储在了main Thread中的一个ArrayList中的。
2.5 The Leak Report
通过这个MAT会自动给我们一个最有可能引起内存问题的报告
MAT给出的推断是main Thread中保持了一个Object[]变量,占用了大量的空间,点击details
在Dominator Tree堆积列表中,可以看出实际是存储了大量的Person对象。
2.6 Top Consumer
在Overview界面的actions中选择Top Consumer操作,可以列出dump中占用空间最大的对象,并用类和package分组,当我们分析的dump文件特别大时可以用这个操作先对大对象分析
- 大小: 77.4 KB
- 大小: 70.6 KB
- 大小: 119.6 KB
- 大小: 221.7 KB
- 大小: 166.2 KB
- 大小: 105 KB
- 大小: 153.5 KB
- 大小: 68 KB
- 大小: 75 KB
- 大小: 88.1 KB
- 大小: 263.2 KB
- 大小: 171.7 KB
- 大小: 73.7 KB
- 大小: 99 KB
- 大小: 93.1 KB
- 大小: 120.6 KB
分享到:
相关推荐
Eclipse MAT(内存分析器工具)是分析 JVM 堆 Dump 文件的强大工具。它具有几个非常有效分析内存问题的强大功能。“Incoming references”和“Outgoing references”就是其中一种功能。
NULL 博文链接:https://sdfx.iteye.com/blog/1925086
MAT是分析Java堆内存的一个工具,全称是 The Eclipse Memory Analyzer Tool,用来帮助分析内存泄漏和减少内存消耗。使用MAT分析Java堆快照,可以快速计算出对象的保留大小(Retained Sizes),查找到阻止对象被回收...
Eclipse Memory Analyzer(简称MAT)是一个功能强大的Java堆内存分析工具,旨在帮助开发人员识别和解决Java应用程序中的内存泄漏和性能问题。它可以分析Java堆内存的快照,并提供详细的报告和可视化工具,帮助用户...
(二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.(二)MATJVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.
Android内存分析工具,和AS的.hprof文件配合使用分析应用APP的内存。
mat 内存分析工具 mat 内存分析工具 mat 内存分析工具 mat 内存分析工具
我看到 CSDN上有两个MAT的下载资源但是分太高了,特意下载了最新版的分享下。
使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。 二 使用MAT意义 当服务器应用占用了...
mat 内存分析工具 mat 内存分析工具
JVM内存dump分析工具MAT独立安装包,分析内存溢出利器,可以准确定位内存异常原因,解决问题,MemoryAnalyzer-1.10.0.20200225.zip
图文并茂,具体实例的形式说明内存泄露分析工具MAT的具体使用方法
MAT JVM 内存分析工具.MAT JVM 内存分析工具.MAT JVM 内存分析工具.
MemoryAnalyzer-1.3.1.20140107-win32.win32.x86_64.zip
内存泄漏分析工具mat
(三)MATJVM 内存分析工具.MAT JVM 内存分析工具(三)MATJVM 内存分析工具.MAT JVM 内存分析工具
mat用于分析JVM的内存dump信息,是在JVM内存异常时进行内存分析的好工具
可以可视化分析内存情况,直观的看到数据,方便的锁定问题所在位置。
Mac OS java内存分析工具,Eclipse MAT(Memory analyse tool)
此软件是mat内存分析软件的无需安装版本,点击打开即可使用,Memory Analyzer Version 1.7.0