在 CentOS 上编译 Java(或编译大型 Java 项目)时内存不足,通常不是系统物理内存不够,而是 JVM 或编译器可用内存被限制。下面按常见场景给你一套排查和解决方案。
编译 Java 实际上是 javac / Maven / Gradle 在跑 JVM,默认堆可能只有几百 MB。
物理内存不够时,没有 swap 兜底,直接 OOM。
make -j、mvn -T、Gradle daemon 开太多。
被容器或系统限制最大内存。
export MAVEN_OPTS="-Xms1g -Xmx2g"
mvn clean package
或临时:
mvn -Xmx2g clean package
export GRADLE_OPTS="-Xmx2g -XX:MaxMetaspaceSize=512m"
或修改:
gradle.properties
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m
java -Xmx2g ...
mvn -T 1 clean package
gradle --max-workers=1
make -j2
⚠️
-j越大,内存消耗越高
free -h
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
systemctl list-units --type=service
临时关闭:
systemctl stop xxx
释放内存:
sync && echo 3 > /proc/sys/vm/drop_caches
--with-jobs=2
--disable-warnings-as-errors
make JOBS=2
OpenJDK 编译非常吃内存,建议:
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"
如果你愿意,可以把下面信息发我,我可以给你精确方案:
free -h 输出我可以直接帮你算该配多少内存。