这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
Memory Analyzer (MAT)
The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.
安装
官网地址:www.eclipse.org/mat/
目前MAT已经迭代到了1.12.0版本, 已经支持解析OpenJDK 15的堆信息。
需要注意的是,MAT本身也是java应用,运行所需的最低java版本已经是Jdk 11了。
配置
解压之后,根据自己的电脑配置和堆转储文件的大小,酌情改一下MemoryAnalyzer.ini中的Xmx的大小。
获取堆转储文件
介绍几种方式:
- 从服务器上直接dump,一般是联系运维同学帮忙操作,传到本地进行分析。
jmap -dump:format=b,file={dumpfile.hprof} {pid}
举例:jmap -dump:format=b,file=20210823.hprof 55244
- 还可以配置在启动参数上,当发生内存溢出时,会自动dump文件。
-XX:+HeapDumpOnOutOfMemoryError
- 通过VisualVM,这里建议下载一个idea插件:
插件安装好之后,可以在debug按钮后面找到新增的两个橘色按钮,和正常的run、debug相比,会在启动的同时打开 Java visualVM。
切换到监视页签,可以点击图示位置的按钮,进行dump操作。
加载文件
这里面最常用的功能就是Histogram、Leak Suspects。
先贴一下代码:
@Controller
public class HelloWorldController {
@GetMapping("index")
public void index() throws InterruptedException {
hi();
}
public void hi() throws InterruptedException {
int size = 1024 * 1024;
List<byte[]> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
System.out.println("存放了" + (i + 1) + "M 数据");
list.add(new byte[size]);
Thread.sleep(1000);
}
}
}
Leak Suspects:
图中黄色部分是问题描述,一个tomcat任务线程保存了33M的本地变量,Keywords里面甚至给出了具体的类名和行数。
点进详情,还可以查看完整的堆栈信息
Histogram
上面三个步骤,意思是查看排除虚引用/弱引用/软引用等的引用链,因为被虚引用/弱引用/软引用的对象可以直接被GC给回收,我们要看的就是某个对象否还存在Strong 引用链(在导出HeapDump之前要手动出发GC来保证),如果有,则说明存在内存泄漏,然后再去排查具体引用。
可以清楚的看到List里面,33个byte数组,每个占用1M内存。
好了,今天就先介绍到这里,我们下期再见👋🏻。