在 CentOS 上“Java 内存满了”一般不是系统本身的问题,而是 JVM 内存配置 / 应用内存泄漏 / 系统参数不合理 导致的。下面按常见情况给你梳理一下。
表现:
java.lang.OutOfMemoryErrortop 里 java 进程 RES 很大常见 OOM 类型:
Java heap space → 堆内存不够GC overhead limit exceeded → GC 频繁Metaspace → 类加载太多Unable to create new native thread → 线程数过多表现:
free -h 中 available 很小top 里 java 占几 GB 甚至全部很多人直接跑:
java -jar xxx.jar
默认堆大小可能很小或被系统限制。
✅ 建议显式指定:
java -Xms512m -Xmx2g -jar xxx.jar
-Xmx 太大 → 系统内存被吃光-Xmx 太小 → 频繁 Full GC查看当前 JVM 参数:
jps
jinfo <pid> | grep Xmx
典型场景:
排查工具:
jmap -heap <pid>
jstat -gcutil <pid> 1000
导出堆:
jmap -dump:live,format=b,file=heap.hprof <pid>
用 MAT / VisualVM / JProfiler 分析。
表现:
OutOfMemoryError: Metaspace
原因:
解决:
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
错误:
Unable to create new native thread
CentOS 限制:
ulimit -u
可能太小(如 4096)
查看线程数:
ps -eLf | grep java | wc -l
如果在 Docker 里跑 Java:
✅ Java 8u191+ / Java 11+:
-XX:+UseContainerSupport
# 系统内存
free -h
top
# Java 进程
jps
top -p <pid>
# GC 情况
jstat -gcutil <pid> 1000
# 堆信息
jmap -heap <pid>
java \
-Xms1g -Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/data/logs/heap.hprof \
-jar app.jar
如果你愿意,可以把下面信息发我,我可以更精准判断:
java -version)free -h 输出我可以直接帮你定位是 配置问题还是代码问题。