在 CentOS 上用 javac 或构建工具(Maven / Gradle)编译 Java 项目时,经常会遇到 内存不足(OOM / GC overhead / Could not reserve enough space) 的问题。下面按「原因 → 解决方式」系统说明。
ulimit 限制export MAVEN_OPTS="-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m"
mvn clean package
或写在 ~/.mavenrc:
export MAVEN_OPTS="-Xmx2048m"
export GRADLE_OPTS="-Xmx2048m -Xms512m"
或在 gradle.properties:
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
javac 一般不吃大内存,但 IDE / 构建系统会:
javac -J-Xmx1024m *.java
CentOS 没有 swap 时编译必炸。
# 查看
free -h
swapon -s
# 创建 4G swap
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
mvn -T 1C clean package
# 或
mvn -T 2 clean package
org.gradle.parallel=false
org.gradle.daemon=false
ulimit -a
如果 max memory size 很小:
ulimit -m unlimited
ulimit -v unlimited
(CentOS 7+ 通常受 cgroup 限制,需改 systemd)
mvn -Dmaven.repo.local=/tmp/repo clean package
gradle --no-daemon build
✅ 推荐组合:
export MAVEN_OPTS="-Xms256m -Xmx1024m"
swap 2G+
mvn -T 1 clean package
| 报错 | 原因 |
|---|---|
Could not reserve enough space |
Xmx 太大 |
GC overhead limit exceeded |
内存不够 |
Java heap space |
堆太小 |
Cannot allocate memory |
系统内存不足 |
你可以告诉我:
free -h)我可以直接给你最优参数配置。