在 Ubuntu 上运行 Java 程序出现内存溢出(OutOfMemoryError),通常不是 Ubuntu 本身的问题,而是 JVM 内存配置或程序本身的问题。下面按「常见原因 → 排查方法 → 解决建议」来说明。
java.lang.OutOfMemoryError: Java heap space
原因:
-Xmx 设置太小✅ 示例:
java -Xmx512m MyApp
如果程序实际需要 1G,就会溢出。
java.lang.OutOfMemoryError: Metaspace
原因:
-XX:MaxMetaspaceSize 没设置或太小在 Ubuntu + Docker / K8s 中很常见:
结果:
✅ 查看是否被限制:
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
java.lang.OutOfMemoryError: unable to create new native thread
原因:
ulimit -u 限制查看限制:
ulimit -u
java.lang.OutOfMemoryError: Direct buffer memory
原因:
-XX:MaxDirectMemorySize 没设置free -h
top
如果物理内存 + Swap 都用光,Java 一定挂。
grep -i "OutOfMemory" app.log
jps
jinfo <pid>
jmap -dump:live,format=b,file=heap.hprof <pid>
然后用:
dmesg | grep -i "killed"
如果是 Out of memory: Kill process,说明是系统级 OOM
java \
-Xms512m -Xmx2g \
-XX:MaxMetaspaceSize=256m \
-XX:MaxDirectMemorySize=256m \
-jar app.jar
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=75
ulimit -u 65535
或编辑 /etc/security/limits.conf
Ubuntu 上 Java 内存溢出,99% 是 JVM 内存配置不合理或程序内存使用不当,而不是 Ubuntu 系统问题。
如果你愿意,可以把:
java -version发出来,我可以帮你精准定位。