线上程序有时候会遇到OOM的情况,这个时候就需要把其oom的堆dump下来,来分析OOM的原因,如果dump文件比较小,则可以直接拉取到本地,通过使用jvisualvm就可以。但是如果dump文件比较大,应该怎么办呢?要是拉取到本地,是不现实的。比如dump文件有40GB,拉取到本地显然不现实,有没有一种方法可以在远程机器(通常指服务器机器,因为这个机器的内存和磁盘一般比较充足)上分析的呢。eclipse的MAT工具正好可以满足要求。
dump文件传输到本地进行分析, 常常需要大量的等待时间。 使用IBM的eclipse的MAT工具可以直接在服务器上进行快速DUMP分析。
运行环境要求
linux操作系统
JDK8 以上
下载MAT的linux版本
Eclipse的MAT工具下载链接
MAT支持各种操作系统,找到Linux版本下载下来1
2
3# 运行uname -m 看一下linux是 x86_64还是 x86的帮助你选择下载那个版本。
uname -m
#x86_64
1 | wget http://iso.mirrors.ustc.edu.cn/eclipse/mat/1.10.0/rcp/MemoryAnalyzer-1.10.0.20200225-macosx.cocoa.x86_64.zip |
解压配置MAT基本参数
1 | unzip MemoryAnalyzer-1.8.0.20180604-linux.gtk.x86_64.zip |
jmap dump整个堆
想了解更详细的请看这篇博文望闻问切使用jstack和jmap剖析java进程各种疑难杂症
1 | jmap -dump:format=b,file=jmap.info PID |
MAT分析 dump
1 | ./ParseHeapDump.sh jmap.info org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components |
等待结果….
结果会生产如下三个zip文件,很小可以直接拷贝到本机
1 | jmap_Leak_Suspects.zip |
查看报告结果
有两种查看报告的方法
- 直接把zip下载到本地,然后解压用浏览器查看index.html
- 把zip下载到本地, 用MAT可视化工具解析zip
遇到问题
Unable to initialize GTK+
遇到这个问题的话,是因为ParseHeapDump.sh
里面需要调用GTK的一些东西。解决方法:
1 | vi ParseHeapDump.sh |
然后继续运行1
./ParseHeapDump.sh jmap.info org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
问题解决
MAC 如何使用 mat工具
MAC 版本 Eclipse的MAT工具下载链接
下载加压缩以后
1 | #修改内存大小,默认1G不够用 |
运行
1 | sudo mat.app/Contents/MacOS/MemoryAnalyzer |
参考资料
linux使用MAT分析dump文件
Java故障诊断和性能分析工具
Tool for analyzing large Java heap dumps
Linux下快速分析DUMP文件