必须配置-xx:+heapdumponoutofmemoryerror和-xx:heapdumppath绝对路径,确保目录存在、jvm进程有写权限且磁盘空间充足;推荐用/path/to/dump/目录形式或oom_%p_%t.hprof动态命名,避免覆盖并支持多实例。

Java 内存溢出(OOM)时自动生成 Dump 文件,核心就两条 JVM 参数:开启开关 + 指定路径。配置正确后,一旦发生 java.lang.OutOfMemoryError: Java heap space 等堆溢出,JVM 会立即写入一个 .hprof 文件,无需人工介入、也不依赖进程是否存活。
必须配置的两个 JVM 参数
-XX:+HeapDumpOnOutOfMemoryError:启用 OOM 自动转储功能,这是触发机制的总开关。
-XX:HeapDumpPath=/path/to/dump/:指定保存目录或完整文件名。注意必须是绝对路径,且目标位置需满足:
• 目录已存在
• JVM 进程对该路径有写权限
• 磁盘剩余空间充足(Dump 文件大小 ≈ 当前堆实际占用,可能达 GB 级)
路径写法的两种常见形式
• 只写目录(推荐生产环境):
-XX:HeapDumpPath=/opt/logs/heap/
JVM 会自动生成类似 java_pid12345.hprof 的文件,含 PID,避免多实例冲突。
• 指定完整文件名(适合单实例调试):
-XX:HeapDumpPath=/tmp/oom-dump.hprof
每次覆盖写入,方便快速定位单次问题,但不适用于滚动重启或集群场景。
• 带时间戳和 PID 的命名(Docker 或高并发推荐):
-XX:HeapDumpPath=/data/dump/oom_%p_%t.hprof
%p 是进程 ID,%t 是 Unix 时间戳(秒级),确保唯一性,也便于日志关联。
启动命令示例(Spring Boot 场景)
java -Xms2g -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/logs/heap/ -jar app.jar
如果用 shell 启动并希望按时间区分:
java -Xms2g -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/logs/heap-$(date +%s).hprof -jar app.jar
验证配置是否生效
• 启动后执行 ps aux | grep java,确认命令行中包含 -XX:+HeapDumpOnOutOfMemoryError
• 主动触发一次可控 OOM(如循环 new 大对象),观察目标路径是否生成 .hprof 文件
• 查看应用日志,成功时会打印类似:
Heap dump file created: /opt/logs/heap/java_pid12345.hprof
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











