温馨提示×

CentOS编译Java内存不足咋办

小樊
37
2026-08-19 17:12:14
栏目: 编程语言

CentOS 上编译 Java(或编译大型 Java 项目)时内存不足,通常不是系统物理内存不够,而是 JVM 或编译器可用内存被限制。下面按常见场景给你一套排查和解决方案。


一、最常见原因

1️⃣ JVM 堆内存太小(最常见)

编译 Java 实际上是 javac / Maven / Gradle 在跑 JVM,默认堆可能只有几百 MB。

2️⃣ 交换分区(swap)没开或太小

物理内存不够时,没有 swap 兜底,直接 OOM。

3️⃣ 并发编译线程太多

make -jmvn -T、Gradle daemon 开太多。

4️⃣ 系统限制(ulimit / cgroup)

被容器或系统限制最大内存。


二、快速解决方案(按优先级)

✅ 方案 1:给 JVM 多分配内存(最推荐)

Maven 编译

export MAVEN_OPTS="-Xms1g -Xmx2g"
mvn clean package

或临时:

mvn -Xmx2g clean package

Gradle 编译

export GRADLE_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m"

或修改:

gradle.properties
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m

直接 javac(少见)

java -Xmx2g ...

✅ 方案 2:减少并发编译

Maven

mvn -T 1 clean package

Gradle

gradle --max-workers=1

C/C++(如果是 OpenJDK 源码)

make -j2

⚠️ -j 越大,内存消耗越高


✅ 方案 3:开启或增加 Swap(非常有效)

查看 swap

free -h

创建 swap(示例 4G)

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

永久生效

echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

✅ 方案 4:关闭不必要的服务

systemctl list-units --type=service

临时关闭:

systemctl stop xxx

释放内存:

sync && echo 3 > /proc/sys/vm/drop_caches

三、如果是编译 OpenJDK 本身

configure 阶段

--with-jobs=2
--disable-warnings-as-errors

make

make JOBS=2

OpenJDK 编译非常吃内存,建议:

  • 至少 8GB 内存 + 4GB swap
  • 或直接在服务器上编译

四、检查系统限制

ulimit

ulimit -a

临时提高:

ulimit -s 10240
ulimit -v unlimited

五、推荐的最低配置(经验值)

场景 内存建议
Maven / Gradle 普通项目 4GB
大型微服务项目 8GB
编译 OpenJDK 8–16GB
云服务器 + swap

六、最常见一句话解决

90% 的情况只需要:

export MAVEN_OPTS="-Xmx2g"

export GRADLE_OPTS="-Xmx2g"

如果你愿意,可以把下面信息发我,我可以给你精确方案

  • ✅ 是 Maven / Gradle / 直接 javac / OpenJDK
  • ✅ 报错信息(OOM / GC overhead / exit code 137)
  • free -h 输出
  • ✅ 当前 CentOS 版本

我可以直接帮你算该配多少内存。

0