叙述
OOM,全称“Out Of Memory”。当 JVM 内存严重不足时,就会抛出 java.lang.OutOfMemoryError 错误。而 JVM dump 文件则是定位内存泄漏等 OOM 问题的关键证据,下面通过样例演示如果生成这个文件。
解决方案
让 JVM 碰到 OOM 场景时自动输出 dump 信息
我们可以添加 -XX:+HeapDumpOnOutOfMemoryError 参数开启“当堆内存空间溢出时输出堆的内存快照”功能,而 -XX:HeapDumpPath 参数则指定生成的堆转储存放位置。
//存放位置使用相对路径
nohup java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar test-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
//存放位置使用绝对路径
nohup java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/log/ -jar test-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
这样当发生 OOM 时,指定目录下就会生成一个名为 java_pidxxxx.hprof 的文件,然后我们就可以使用 MAT 等工具打开这个文件进行分析了。
在运行时手动导出堆 Dump 文件
首先执行 jps 命令找到相应 java 进程的 pid:
接着使用 jmap 命令导出即可:
jmap -dump:format=b,file=/usr/local/test.hprof 6902