一、常见需要分析dump文件场景
1.1 fullGC频繁
1.2 堆空间溢出
1.3 元空间溢出
二、准备工具
能分析dump文件的工具很多比如Java自带的jvisualvm、商业软件Jprofile、mat(MemoryAnalyzerTool)、IDEA等,其他软件都需要将dump文件下载到本地分析,当dump文件很大的时候不方便,mat有linux版本可以直接在服务器上生成报告,将报告导入本地分析以及共享给研发人员分析。本文介绍一下mat(Linux)分析dump文件的过程。
2.1 mat与JDK版本对应关系
Memory Analyzer 1.14 及更高版本 JDK17及以上
Memory Analyzer 1.12 及更高版本 JDK11及以上
Memory Analyzer 1.8 至 1.11 需要 Java 1.8 VM 或更高版本的 VM 才能运行
最新版本:https://eclipse.dev/mat/download/
历史版本:https://eclipse.dev/mat/download/previous/
三、Linux-Mat分析dump流程
3.1 确认应用及环境jdk版本
选择合适版本,本例服务器jdk版本是1.8可以选择mat1.11及之前的版本
3.2 获取.hprof文件
3.2.1 被动获取
新版组件一般都默认开启如下启动参数,内存溢出错误时会自动dumpJVM的内存镜像,当系统发生OOM异常时可以检查当前应用文件夹查看是否存在dump文件。
# 当应用发生oom异常时自动dump -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=gc.hprof
3.2.2 主动获取
如果启动命令没有配置以上参数,当发生OOM相关异常的时候,不要立即重启,建议先进行dump处理,操作命令如下:
jps -l ##或者 ps -aux | grep java 找到对应应用的PIDjmap -dump:live,format=b,file=dump.hprof pid ##file=dump.hprof指定生成dump文件 pid是应用PID
3.3 调整Mat参数
编辑 MemoryAnalyzer.ini,调整mat参数,-Xmx16g一般设置为dump文件大小的二倍左右,如需指定JDK版本 ,在任何 -vmargs 行之前加入(两行)示例如下:
示例:
-startupplugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar--launcher.libraryplugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.100.v20110505-vm /home/yangxz/java/bin/java #指定JDK版本-vmargs-Xms16g -Xmx16g #最大堆内存
3.4 执行命令生成 zip
nohup ./ParseHeapDump.sh /home/yangxz/test/sdm_oom.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components & echo $! > pid
命令说明:
nohup ./ParseHeapDump.sh #后台执行脚本 /home/yangxz/test/sdm_oom.hprof #dump文件 org.eclipse.mat.api:suspects # 生成泄漏疑点(Leak Suspects)报告 org.eclipse.mat.api:overview # 生成堆转储概览报告。 org.eclipse.mat.api:top_components # 生成内存占用最大的组件报告。
生成压缩文件示例:
解压后点击Index.html进入报告:
报告示例:
四、Mat桌面版本分析dump
4.1 下载windows版本mat,并确保本地有安装好Java环境
打开后在File里面选择OpenHeapDump打开要分析的hprof文件