使用MAT(MemoryAnalyzer)分析dump文件排查内存泄漏

2020/01/23

之前介绍过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: 分析属于公共包或类装入的对象

如果觉得本篇文章帮助到了您,可以请我喝杯咖啡 在这里插入图片描述

Post Directory