在 Linux 上运行 Java 程序时出现内存溢出(OutOfMemoryError,OOM),通常不是“Linux 的问题”,而是 JVM 内存模型 + 应用代码 + 系统资源限制 共同作用的结果。下面从常见原因 → 典型场景 → 排查方法系统说明。
java.lang.OutOfMemoryError: Java heap space
原因
✅ 常见场景
java.lang.OutOfMemoryError: Metaspace
原因
✅ 常见场景
java.lang.OutOfMemoryError: GC overhead limit exceeded
原因
✅ 说明
OutOfMemoryError: Direct buffer memory
或
原因
-XX:MaxDirectMemorySizejava.lang.OutOfMemoryError: unable to create new native thread
原因
✅ 检查
ulimit -u
cat /proc/sys/kernel/threads-max
✅ 解决
-XX:+UseContainerSupport
-Xmx=容器内存 * 0.7
dmesg | grep -i oom
grep OutOfMemory error.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/heap.hprof
分析工具:
jmap -heap <pid>
jstat -gc <pid>
free -m
top
dmesg | grep oom
| 问题 | 解决 |
|---|---|
| 堆太小 | 调大 -Xmx |
| 缓存无限 | 用 LRU / TTL |
| 大查询 | 分页 / 流式 |
| 热部署 | 控制 ClassLoader |
| 容器 | 开启 container support |
| 线程爆炸 | 线程池 |
Linux 上 Java 内存溢出,90% 是“应用用太多 + JVM 配置不合理 + 系统限制不清楚”共同造成的。
如果你愿意,可以告诉我:
我可以直接帮你定位到具体原因和参数配置。