在 CentOS 编译 Java(OpenJDK 或大型 Java 项目) 时,出现 内存不足(OOM / 编译卡死 / 进程被杀),通常是因为编译过程非常吃内存。下面按常见场景 + 解决方案给你一套完整应对方案。
free -h
Mem 小于 4G → 编译容易 OOMSwap 为 0 → 风险极高查看是否被 kill:
dmesg | tail
看到 Out of memory: Kill process xxx (java) 就确认了。
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' | sudo tee -a /etc/fstab
重新编译,成功率会大幅提升。
make -j2
或更低:
make -j1
-j越大越吃内存,建议:
-j1-j2export _JAVA_OPTIONS="-Xmx512m"
或:
export JAVA_TOOL_OPTIONS="-Xmx512m"
再执行:
make images
./configure \
--disable-warnings-as-errors \
--with-native-debug-symbols=none
如果机器特别小:
export JOBS=1
export MAVEN_OPTS="-Xmx512m -Xms128m"
mvn clean package -T 1
sync
echo 3 > /proc/sys/vm/drop_caches
⚠️ 仅临时缓解,不治本。
| 内存 | 建议 |
|---|---|
| ≤2G | 不建议直接编译 JDK |
| 4G | -j2,加 swap |
| 8G+ | 正常编译 |
最低配置的实用方案:
# 增加 swap
sudo fallocate -l 4G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 限制内存
export _JAVA_OPTIONS="-Xmx512m"
# 单线程编译
make -j1
如果你愿意,可以告诉我:
我可以直接给你 一套针对你机器的编译命令。