温馨提示×

centos啥情况java内存满

小樊
50
2026-10-08 16:08:48
栏目: 编程语言

在 CentOS 上“Java 内存满了”一般不是系统本身的问题,而是 JVM 内存配置 / 应用内存泄漏 / 系统参数不合理 导致的。下面按常见情况给你梳理一下。


一、先确认“内存满”是哪一种

1️⃣ 是 JVM 内存满(常见)

表现:

  • java.lang.OutOfMemoryError
  • 应用变慢、卡死、自动重启
  • top 里 java 进程 RES 很大

常见 OOM 类型:

  • Java heap space → 堆内存不够
  • GC overhead limit exceeded → GC 频繁
  • Metaspace → 类加载太多
  • Unable to create new native thread → 线程数过多

2️⃣ 是系统内存满(OS 级)

表现:

  • free -h 中 available 很小
  • top 里 java 占几 GB 甚至全部
  • 系统开始 kill 进程(OOM Killer)

二、CentOS 上 Java 内存常见问题原因

✅ 1. JVM 没设内存参数(最常见)

很多人直接跑:

java -jar xxx.jar

默认堆大小可能很小或被系统限制。

✅ 建议显式指定:

java -Xms512m -Xmx2g -jar xxx.jar

✅ 2. 堆内存设置不合理

  • -Xmx 太大 → 系统内存被吃光
  • -Xmx 太小 → 频繁 Full GC

查看当前 JVM 参数:

jps
jinfo <pid> | grep Xmx

✅ 3. 内存泄漏(代码问题)

典型场景:

  • 静态 Map 一直 put
  • 线程池不回收
  • 大量对象未释放
  • 缓存无过期

排查工具:

jmap -heap <pid>
jstat -gcutil <pid> 1000

导出堆:

jmap -dump:live,format=b,file=heap.hprof <pid>

用 MAT / VisualVM / JProfiler 分析。


✅ 4. Metaspace 满(Java 8+)

表现:

OutOfMemoryError: Metaspace

原因:

  • 动态代理太多
  • 热部署频繁
  • 类加载器泄漏

解决:

-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m

✅ 5. 线程数爆炸

错误:

Unable to create new native thread

CentOS 限制:

ulimit -u

可能太小(如 4096)

查看线程数:

ps -eLf | grep java | wc -l

✅ 6. CentOS + Docker 内存限制坑

如果在 Docker 里跑 Java:

  • 老 JDK 看不到 cgroup 限制
  • 会按宿主机内存分配

✅ Java 8u191+ / Java 11+:

-XX:+UseContainerSupport

三、快速排查命令(CentOS)

# 系统内存
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

如果你愿意,可以把下面信息发我,我可以更精准判断:

  1. Java 版本(java -version)
  2. 报错完整信息
  3. free -h 输出
  4. 是否 Docker / K8s
  5. 应用类型(Spring Boot?)

我可以直接帮你定位是 配置问题还是代码问题。

0 踩