必须配置-xx:+heapdumponoutofmemoryerror和-xx:heapdumppath=/absolute/path/to/dumps/,路径须为绝对路径、jvm用户有写权限且磁盘充足;推荐用%p、%t动态命名,辅以gc日志分析。

JVM 堆内存溢出(java.lang.OutOfMemoryError: Java heap space)时自动生成转储文件,核心是启用 -XX:+HeapDumpOnOutOfMemoryError 并**必须指定有效路径**。光加开关不设路径,JVM 默认尝试写入启动目录,生产环境几乎必然失败——不是没生成,而是静默丢弃。
关键参数必须成对配置
仅开启开关不够,-XX:HeapDumpPath 是生效前提:
-
-XX:+HeapDumpOnOutOfMemoryError:启用 OOM 时触发堆转储的开关 -
-XX:HeapDumpPath=/opt/app/logs/oom_%p_%t.hprof:推荐带占位符的动态路径
•%p自动替换为进程 PID,避免多实例覆盖
•%t替换为时间戳(秒级),便于按时间定位 - 路径所在目录需提前创建,并确保 JVM 进程用户有写权限(如
chown appuser:appuser /opt/app/logs)
容器环境要特别注意挂载与权限
在 Docker 或 Kubernetes 中,/opt/app/logs 这类路径若未挂载宿主机卷,容器销毁后 dump 就彻底丢失:
- 启动容器时显式挂载:
docker run -v /host/dumps:/opt/app/logs ... - Dockerfile 中预设权限:
RUN chown -R appuser:appuser /opt/app/logs - 禁用
/tmp、/dev/shm等临时路径——它们可能被清理或受限
搭配 GC 日志提升分析效率
OOM 往往伴随 GC 行为异常,单独 dump 文件缺乏上下文。建议同步开启:
-
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps:输出详细 GC 时间点和行为 -
-Xloggc:/opt/app/logs/gc.log(JDK 9+)或-XX:+UseGCLogFileRotation:防止 GC 日志撑爆磁盘 - 对比 dump 文件生成时间戳与 GC 日志中最后一次 Full GC 时间,可快速判断是否因晋升失败或回收无效导致 OOM
生成后务必快速验证有效性
别等出问题才查,上线前就跑通验证流程:
- 检查文件大小:
ls -lh /host/dumps/oom_*.hprof,正常应 ≥ 几十 MB(空文件或几 KB 说明生成失败) - 确认格式:
file oom_*.hprof应输出含Java HotSpot字样 - 轻量分析(无 GUI 时):
ParseHeapDump.sh oom_*.hprof org.eclipse.mat.api:suspects查看疑似泄漏对象











