MemoryAnalyzerTool(mat)分析dump文件
一、常见需要分析dump文件场景
1.1 fullGC频繁
1.2 堆空间溢出
1.3 元空间溢出
二、准备工具
能分析dump文件的工具很多比如Java自带的jvisualvm、商业软件Jprofile、mat(MemoryAnalyzerTool)、IDEA等,除了mat和jvisualvm其他软件不能在Linux环境分析,当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 才能运行

三、Linux-Mat分析dump流程
3.1 确认应用及环境jdk版本
选择合适版本,本例服务器是x86架构64位机器jdk版本1.8选择的mat版本是 MemoryAnalyzer-1.9.2.20200115-linux.gtk.x86_64.zip

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 找到对应应用的PID jmap -dump:live,format=b,file=dump.hprof pid ##file=dump.hprof指定生成dump文件 pid是应用PID
3.3 调整Mat参数
编辑 MemoryAnalyzer.ini,调整mat参数,-Xmx16g一般设置为dump文件大小的二倍左右,如需指定JDK版本 ,在任何 -vmargs 行之前加入(两行)示例如下:

示例:
-startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.library plugins/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文件


本文作者:MuXinu
本文链接:https://www.cnblogs.com/MuXinu/p/18660721
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步