1. 场景

在使用Elasticsearch时,碰到内存溢出的情况,因为配置了-XX:+HeapDumpOnOutOfMemoryError索引会直接把Dump自动存为文件。

但是对于这类生成的文件,往往会很大:

1
-rw-------  1 ant ant  26G May 29 21:08 java_pid7446.hprof

26G 的文件在服务器上该怎么分析堆栈?就算是拉取到本地,也没有这么大的内存去分析。

所以更好的办法就是直接在服务器上利用MAT进行分析。

对于Dump的生成,也可以手动导出

1
jmap -dump:live,format=b,file=m.hprof PID

2. 下载Linux下的MAT

下载地址:https://www.eclipse.org/mat/downloads.php

下载对应的版本:

mat-download

最后解压即可。

3. 执行分析命令

1
2
nohup ./ParseHeapDump.sh ./java_pid7446.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components &
echo $! > pid

注意这里使用了nohup ,因为对于大文件的分析,并不能保证shell窗口的活动时间,所以使用nohup,并保存了pid,以便于查看是否执行完毕。

等待执行完毕后,就能看到结果了:

mat-done

4. 打开并分析报告

在拿到结果后,只需要吧三个.zip包传到本地,解压后,用浏览器打开网页即可。

mat-report

通过这个就可以来愉快地分析啦。

5. 总结

这里主要是介绍如何利用服务器来分析超大的Dump文件,而不用担心在本地内存不够或者机器受限的问题。

而对于报告具体的分析,后续我也会分享出来,期待你的持续关注。