Java 服务 OOM 排查¶
现象¶
- Java 服务突然退出。
- 日志出现
OutOfMemoryError。 - 接口大量超时,进程内存持续升高。
- 系统日志出现 OOM Killer。
快速判断¶
ps aux --sort=-%mem | head -n 10
dmesg -T | grep -i "out of memory"
journalctl -k | grep -i "killed process"
排查命令¶
# 查看 Java 进程
jps -l
# 查看 JVM 参数
jcmd <PID> VM.flags
# 查看堆信息
jcmd <PID> GC.heap_info
# 导出线程栈
jstack <PID> > jstack.txt
如果服务仍可响应,可以导出堆转储:
jmap -dump:format=b,file=heap.hprof <PID>
常见原因¶
- JVM 堆设置过小。
- 内存泄漏。
- 大对象或大查询结果占用内存。
- 线程数过多。
- 容器内存限制小于 JVM 预期。
- 频繁 Full GC 导致服务不可用。
处理建议¶
- 先保留日志、GC 日志、线程栈和必要的 heap dump。
- 容器环境检查内存 limit 和 JVM 参数是否匹配。
- 结合监控确认内存增长趋势。
- 临时恢复可以重启服务,但需要继续定位根因。
高危提醒¶
jmap -dump可能生成很大的文件,执行前确认磁盘空间。- heap dump 可能包含敏感业务数据,传输和分享前要脱敏。