在 CentOS 上用 javac 或 Java 相关构建工具(Maven / Gradle)编译时提示内存不足(OutOfMemoryError / 编译卡死 / 被 kill),常见原因和解决办法如下:
free -h
top
如果 available 很少,或者编译时 java 进程被 OOM Killer 杀掉(看 /var/log/messages 或 dmesg):
dmesg | grep -i oom
那就是系统内存不足。
javac 本身一般不太吃内存,但大项目可能不够。
export JAVAC_OPTS="-J-Xmx2g"
javac $JAVAC_OPTS ...
make -j1
# 或 maven 单线程
Maven 默认 JVM 内存较小。
export MAVEN_OPTS="-Xmx2g -Xms1g -XX:MaxMetaspaceSize=512m"
mvn clean package
永久生效可写入:
vi ~/.bashrc
export MAVEN_OPTS="-Xmx2g -Xms1g"
source ~/.bashrc
mvn -T1 clean package
Gradle 很吃内存。
vi ~/.gradle/gradle.properties
加入:
org.gradle.jvmargs=-Xmx2g -Xms1g -XX:MaxMetaspaceSize=512m
org.gradle.parallel=false
CentOS 没有 swap 时很容易 OOM:
# 创建 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
编译时关闭:
| 场景 | 建议 |
|---|---|
| 小项目 | -Xmx1g |
| 中大型 | -Xmx2g~4g |
| 服务器 4G | 加 swap + -Xmx2g |
| 服务器 2G | 必须加 swap |
free -h 看内存dmesg | grep oomMAVEN_OPTS / gradle.properties如果你能告诉我:
我可以给你精确参数配置。