- 下面方法是通过启动命令生成Dump,也可通过 jmap 命令单独生成,此例不做讲解
// -Xms:初始对大小 -Xmx:最大堆大小 -XX:+UseG1GC:指定使用G1收集器
// -XX:+HeapDumpOnOutOfMemoryError 内存溢出时生成Dump文件 -XX:HeapDumpPath:生成路径
java -Xms1024m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar Alpha_2.jar
// 多加了用于JVM可视化工具链接的参数,不需要可视化工具的选用上面的即可
java -Djava.rmi.server.hostname=192.168.88.88 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=3214 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1024m -Xmx1024m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar Alpha_2.jar
JVM可视化工具我用的JDK自带的 JConsole,方便了解内存占用情况
以服务器程序内存溢出排查为例
- 要注意的是生成的Dump文件大小与你JVM内存大小一致,导致文件从服务器拉取下来过慢,所以需要在服务器上安装个 MAT。如果你的Dump文件小则可以拉取下来用MAT直接打开。
- 解压MAT.zip
// 安装 unzip: yum install -y unzip zip
unzip MemoryAnalyzer-1.10.0.20200225-linux.gtk.x86_64.zip
// 解压后生成名为 mat 文件
- 内存溢出后会自动生成 hprof 文件,然后通过MAT分析它
// 进入到有 ParseHeapDump.sh 文件的目录。‘/root/java_pid16773.hprof’ 替换为自己文件路径
./ParseHeapDump.sh /root/java_pid16773.hprof org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components
- 执行后会生成三个zip,拉取到本地即可(分析后的文件大小要比原文件缩小很多)
- 解压后打开 index.html 即可
- 通过 html 可查看对象占用内存情况,定位溢出代码,帮助我们更好的分析溢出原因。