在 CentOS 上出现 Java 内存溢出(OutOfMemoryError),通常不是 CentOS 本身的问题,而是 JVM、应用代码、系统资源限制 导致的。下面按常见原因给你系统梳理一下。
报错示例:
java.lang.OutOfMemoryError: Java heap space
原因:
-Xmx 不够)解决:
java -Xms512m -Xmx2048m -jar app.jar
并用工具分析:
jmapjstack报错:
java.lang.OutOfMemoryError: Metaspace
原因:
解决:
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
报错:
java.lang.OutOfMemoryError: unable to create new native thread
原因(CentOS 很常见):
ulimit -u 太小-Xss 太大CentOS 查看:
ulimit -u
cat /proc/sys/kernel/pid_max
解决:
# 修改用户线程数
/etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
报错:
java.lang.OutOfMemoryError: Direct buffer memory
原因:
解决:
-XX:MaxDirectMemorySize=512m
free -h
top
可能:
free -h
swapon -s
dmesg | grep -i oom
如果是 systemd 启动:
[Service]
MemoryLimit=2G
可能直接杀 JVM。
# 1. 看内存
free -h
# 2. 看 JVM 参数
ps -ef | grep java
# 3. 看线程数
top -H -p <pid>
# 4. 导出堆
jmap -dump:live,format=b,file=heap.hprof <pid>
# 5. 看系统日志
dmesg | grep oom
CentOS 上 Java 内存溢出,90% 是 JVM 参数不合理 + 代码内存泄漏 + 系统限制(线程/内存)
如果你愿意,可以把:
java -version发出来,我可以帮你精准定位。