之前介绍过Jprofiler分析dump文件排查内存泄漏,Memory Analyzer相比于Jprofiler更加简单高效,可以生成报告,把可能的内存泄漏直接展示出来,本篇文章就来简单介绍一下MAT。
一、下载安装
Memory Analyzer是一个快速且功能丰富的Java堆分析器,是eclipse的一个插件,也可以单独使用。下载之后直接运行exe文件即可。
二、加载dump文件
生成dump文件方法参考:jvm 基础之解析堆dump文件 生成的dump文件的后缀是.dump,要改成.hprof,才能用jprofiler打开,本例中的dump对象是gc之后的对象,gc之前的对象可能不容易找出问题所在。
本文中dump文件 提取码:ojd2
三、选择报告类型
我们是要分析内存泄漏,所以选择第一个leak suspects report
四、生成报告
之后会生成一个内存泄漏疑点报告,下图表明,有两个疑点。
五、解析报告
展开疑点,可以进一步查看细节和堆栈踪迹
六、查看细节
点击Problem Suspect1的Details,查看Accumulated Objects in Dominator Tree,展开Class Name,我们发现有很多Inspect对象,这是导致内存泄漏的原因。
七、定位问题
我们进一步查看堆栈信息,根据包前缀进行查找,定位到程序出问题的地方,已经可以看到导致内存泄漏的代码的具体位置。
八、得出结论
继续查看Problem Suspect 2可以看到是查数据库时出的问题,是查数据时一次性返回过多数据,其列表对象就是InspectObject对象(大对象),占用内存太大,GC无法及时处理,导致内存溢出.
说明
本文只是通过一个实例来简单介绍MAT如何通过dump文件来定位内存泄漏,其它常用的视图还有:
- Histogram:可以列出内存中的对象,对象的个数及其大小
- Dominator tree : 该视图会以占用总内存的百分比来列举所有实例对象
- Top Comsumers:通过图型列出最大的Object
- Duplicate Classes:显示重复的类等信息
- Component Report: 分析属于公共包或类装入的对象
如果觉得本篇文章帮助到了您,可以请我喝杯咖啡