在 CentOS 上编译 Java(或编译大型 Java 项目)时出现“内存不足”,通常不是系统物理内存真的不够,而是编译进程可用的内存被限制或分配不当。常见原因和对应解决办法如下:
编译大型项目时,javac 默认堆内存较小,容易 OOM。
表现:
Java heap spaceGC overhead limit exceeded解决:
export JAVA_TOOL_OPTIONS="-Xmx2g -Xms512m"
或编译时指定:
javac -J-Xmx2g *.java
如果是 Maven / Gradle:
export MAVEN_OPTS="-Xmx2g"
# 或
./gradlew build -Dorg.gradle.jvmargs="-Xmx2g"
CentOS 服务器尤其是云服务器,可能只有 1–2G 内存。
查看:
free -h
解决:
dd if=/dev/zero of=/swapfile bs=1M count=2048
mkswap /swapfile
swapon /swapfile
永久生效需写 /etc/fstab
如果是:
可能被限制了最大内存。
查看:
ulimit -a
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
解决:
/etc/security/limits.confmake -jN 或 Maven/Gradle 并行编译会瞬间吃光内存。
解决:
make -j2
mvn -T 1C compile
如果你是在 CentOS 上编译 OpenJDK:
常见原因:
--with-jobs 太多JOBS建议:
configure --with-num-cores=2 --with-memory-size=2048
make JOBS=2
32 位系统单进程内存上限低(约 2–3G)。
解决:
free -h
ulimit -a
java -version
echo $JAVA_TOOL_OPTIONS
CentOS 编译 Java 内存不足,90% 是 javac / Maven / Gradle 堆内存太小 或 并行编译太多,其次才是系统内存和 cgroup 限制。
如果你能告诉我:
我可以给你更精确的命令。