必须配齐-xx:+heapdumponoutofmemoryerror、-xx:heapdumppath=/data/dumps/(绝对路径且权限正确)、-xx:+exitonoutofmemoryerror,并配合gc日志与上线前oom测试验证,确保.hprof文件真正生成、可读、可用。

JVM 内存溢出时自动生成堆转储快照,关键不是加一个参数就完事,而是让 .hprof 文件真正落地、可读、能用。
必须配齐三个核心参数
-
-XX:+HeapDumpOnOutOfMemoryError:打开 OOM 自动导出开关 -
-XX:HeapDumpPath=/data/dumps/:指定绝对路径(结尾不带.hprof,JVM 会自动生成java_pid12345.hprof) -
-XX:+ExitOnOutOfMemoryError:OOM 后立即退出进程,避免状态污染,尤其适合容器环境
路径和权限不能靠猜
- 目录必须提前创建:
mkdir -p /data/dumps && chown appuser:appuser /data/dumps - 用
ps -o user= -p $(pgrep -f YourApp)查运行用户,再用ls -ld /data/dumps确认写权限 - Kubernetes 中别用
/tmp,它通常是 tmpfs,空间小且易丢;应挂载持久卷到明确路径
配合 GC 日志才看得清来龙去脉
- JDK 8:
-verbose:gc -Xloggc:/var/log/myapp/gc.log -XX:+PrintGCDetails - JDK 9+:
-Xlog:gc*:file=/var/log/myapp/gc.log - GC 日志与
.hprof文件时间戳对齐,能还原 OOM 前内存增长节奏
上线前务必验证是否真生效
- 写个测试接口,循环分配
new byte[100 * 1024 * 1024],快速触发java.lang.OutOfMemoryError: Java heap space - 检查日志是否输出 OOM 异常,并确认
/data/dumps/java_pid*.hprof是否生成 - 用
file /data/dumps/java_pid*.hprof验证文件格式是否为 “Java HotSpot(TM) … hprof binary file”
不复杂但容易忽略










