温馨提示×

centos编译java内存不足怎么破

小樊
40
2026-09-03 06:31:33
栏目: 编程语言

在 CentOS 上编译 Java(比如编译 OpenJDK 或用 javac 批量编译大项目)时遇到内存不足(OOM / Cannot allocate memory / GC overhead limit exceeded),可以从下面几个方向解决。


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

1. 编译进程被系统杀掉

dmesg | grep -i killed

看到 java / cc1 / gcc 被 kill,通常是 物理内存 + Swap 不够

2 Java 报 OOM

java.lang.OutOfMemoryError: Java heap space

GC overhead limit exceeded

这是 JVM 堆内存设置问题


二、编译 OpenJDK / 大型 C++ 项目(configure + make)

1. 减少并行编译线程

make JOBS=2
# 或
make -j2

OpenJDK 默认会用很多线程:

export JOBS=2

2. 增加 Swap(最常见有效)

# 创建 4G swap
sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
sudo mkswap /swapfile
sudo swapon /swapfile

# 开机自动挂载
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab

查看:

free -h

3. 限制 boot JDK 内存

编译 OpenJDK 时会用 boot JDK:

export JAVA_TOOL_OPTIONS="-Xmx512m"

三、用 javac / Maven / Gradle 编译 Java 项目

1. Maven 内存不足

export MAVEN_OPTS="-Xmx1024m -XX:MaxMetaspaceSize=256m"
mvn clean package

或:

mvn -Xmx1024m clean package

2. Gradle 内存不足

修改:

~/.gradle/gradle.properties
org.gradle.jvmargs=-Xmx1024m -XX:MaxMetaspaceSize=256m
org.gradle.parallel=false

3. javac 直接编译

javac -J-Xmx512m *.java

四、系统级优化(CentOS)

1. 调整 vm.overcommit

sysctl vm.overcommit_memory=1

(适合编译场景,不推荐长期生产)

2. 关闭不必要的服务

systemctl list-units --type=service

关掉 mysql / nginx / docker 等


五、云服务器 / 小内存机器建议配置

内存 建议
1G 加 2G swap,JOBS=1
2G 加 2G swap,JOBS=2
4G+ 基本没问题

六、快速自检清单 ✅

  • [ ] free -h 看内存和 swap
  • [ ] 是否加了 swap
  • [ ] 是否限制了并行数
  • [ ] JVM 参数是否设了 -Xmx
  • [ ] 是否是 boot JDK OOM

如果你能告诉我:

  • 编译 OpenJDK 还是 Java 项目
  • CentOS 版本
  • 内存大小

我可以给你一套精确命令

0