在 CentOS 上编译 Java(比如编译 OpenJDK 或用 javac 批量编译大项目)时遇到内存不足(OOM / Cannot allocate memory / GC overhead limit exceeded),可以从下面几个方向解决。
dmesg | grep -i killed
看到 java / cc1 / gcc 被 kill,通常是 物理内存 + Swap 不够。
java.lang.OutOfMemoryError: Java heap space
或
GC overhead limit exceeded
这是 JVM 堆内存设置问题。
make JOBS=2
# 或
make -j2
OpenJDK 默认会用很多线程:
export JOBS=2
# 创建 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
编译 OpenJDK 时会用 boot JDK:
export JAVA_TOOL_OPTIONS="-Xmx512m"
export MAVEN_OPTS="-Xmx1024m -XX:MaxMetaspaceSize=256m"
mvn clean package
或:
mvn -Xmx1024m clean package
修改:
~/.gradle/gradle.properties
org.gradle.jvmargs=-Xmx1024m -XX:MaxMetaspaceSize=256m
org.gradle.parallel=false
javac -J-Xmx512m *.java
sysctl vm.overcommit_memory=1
(适合编译场景,不推荐长期生产)
systemctl list-units --type=service
关掉 mysql / nginx / docker 等
| 内存 | 建议 |
|---|---|
| 1G | 加 2G swap,JOBS=1 |
| 2G | 加 2G swap,JOBS=2 |
| 4G+ | 基本没问题 |
free -h 看内存和 swap-Xmx如果你能告诉我:
我可以给你一套精确命令。