-XX:+HeapDumpOnOutOfMemoryError 可在发生 java.lang.OutOfMemoryError: Java heap space 时自动生成堆快照,配合 -XX:HeapDumpPath 指定路径(支持 %p、%t 动态命名)及 -XX:+PrintGCDetails、-XX:+ExitOnOutOfMemoryError 等参数,提升内存泄漏定位与生产环境稳定性。

在 Java 垃圾回收调优中,-XX:+HeapDumpOnOutOfMemoryError 是一个非常实用的 JVM 参数,它能在发生 OutOfMemoryError(尤其是堆内存耗尽)时,自动触发一次堆快照(heap dump)生成,便于后续用工具(如 VisualVM、JProfiler、Eclipse MAT)分析内存泄漏或对象堆积问题。
启用自动堆快照的基本用法
只需在启动 Java 应用时添加该参数即可:
java -XX:+HeapDumpOnOutOfMemoryError -jar myapp.jar
默认情况下,dump 文件会生成在 JVM 启动目录下,文件名类似 java_pid12345.hprof。注意:该参数只对 java.lang.OutOfMemoryError: Java heap space 生效,对元空间(Metaspace)、直接内存(Direct Memory)等其他类型的 OOM 不触发。
指定 dump 文件保存路径和名称
使用 -XX:HeapDumpPath 可控制输出位置,支持绝对路径、相对路径,甚至可带时间戳动态命名:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
固定路径:
-XX:HeapDumpPath=/var/log/myapp/→ 生成/var/log/myapp/java_pid12345.hprof -
带时间戳(推荐):
-XX:HeapDumpPath=/data/dumps/heap_%p_%t.hprof其中%p表示进程 PID,%t表示 UNIX 时间戳(秒级),避免重复覆盖
配合其他诊断参数一起使用
单靠堆快照往往不够,建议组合以下参数提升问题定位效率:
-
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps:输出详细 GC 日志,帮助判断是否因 GC 频繁或失败导致 OOM -
-Xloggc:/path/to/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M:启用滚动 GC 日志(JDK 9+ 推荐用-Xlog) -
-XX:+ExitOnOutOfMemoryError:OOM 后立即退出进程,避免应用处于不可靠状态(适合容器环境)
注意事项与常见问题
实际使用中需留意几点:
- 堆快照文件可能很大(接近堆大小),确保
HeapDumpPath所在磁盘有足够空间,否则 dump 失败且无提示 - 该参数在 JDK 8u92+ 和 JDK 9+ 中默认可用;旧版本需确认是否支持(部分早期 JDK 7 版本不支持
%t) - 若应用以非 root 用户运行,需保证目标路径具有写权限,否则 dump 会静默失败
- 生产环境慎用
-XX:+HeapDumpOnOutOfMemoryError而不配HeapDumpPath,因为默认落当前目录,容易因权限或空间问题失效

















