应提前配置JVM自动抓取堆转储:启用-XX:+HeapDumpOnOutOfMemoryError,配合-XX:HeapDumpPath指定路径,-XX:OnOutOfMemoryError执行诊断脚本,并限制dump大小、定期验证与监控。

Java 中发生 OOM(OutOfMemoryError)时,关键不是等它报错再处理,而是提前配置好自动抓取堆转储(heap dump)的机制,让 JVM 在 OOM 触发瞬间自动生成现场快照。这样能极大提升问题定位效率。
启用 -XX:+HeapDumpOnOutOfMemoryError
这是最基础也最关键的开关。JVM 遇到 OOM 时会自动生成 .hprof 文件:
- 加在启动参数里,例如:-XX:+HeapDumpOnOutOfMemoryError
- 默认 dump 生成在 JVM 启动目录下,文件名类似 java_pid12345.hprof
- 建议配合 -XX:HeapDumpPath=/path/to/dumps/ 指定统一存放路径,避免找不到或磁盘写满
加上 -XX:OnOutOfMemoryError 执行诊断脚本
单靠 heap dump 有时不够,比如想同时抓线程栈、GC 日志、系统资源状态:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 -XX:OnOutOfMemoryError="sh /opt/scripts/oom-diagnose.sh %p",%p 是当前 Java 进程 PID
- 脚本里可执行 jstack %p > jstack.log、jstat -gc %p > gc.log、记录 free -h、df -h 等
- 注意脚本要有执行权限,路径需 JVM 有写入权限,且尽量轻量,避免拖慢 OOM 处理流程
限制 dump 大小并防止重复刷盘
大堆应用一次 dump 可达数 GB,频繁 OOM 会导致磁盘爆满或阻塞进程:
立即学习“Java免费学习笔记(深入)”;
- 添加 -XX:+HeapDumpBeforeFullGC(可选)辅助判断 GC 前是否已内存紧张
- 用 -XX:HeapDumpAfterFullGC 控制只在 Full GC 后 dump(慎用,可能漏掉非 GC 触发的 OOM)
- 生产环境建议配 -XX:MaxHeapFreeRatio=70 -XX:MinHeapFreeRatio=30,减少内存长期高位驻留
验证和日常巡检不能少
配置完不等于万事大吉,得确认它真能工作:
- 用 jinfo -flag HeapDumpOnOutOfMemoryError <pid> 查看运行中是否生效
- 写个测试类主动触发 OOM(如不断 new byte[1024*1024]),观察 dump 是否生成、路径是否正确
- 定期检查 dump 目录磁盘使用率,加监控告警(如 Prometheus + node_exporter 监控 /dumps 分区)

















