在 CentOS 上用 javac 或 Java 程序编译/运行时提示内存不足(OutOfMemoryError / 编译卡死 / 被 kill),可以从下面几个方面解决。
free -h
top
dmesg | grep -i kill
如果看到 Out of memory: Kill process xxx (java) 说明是被系统 OOM Killer 杀掉了。
export JAVAC_OPTS="-J-Xms512m -J-Xmx2g"
javac $JAVAC_OPTS YourFile.java
如果是 Maven 编译:
export MAVEN_OPTS="-Xms512m -Xmx2g"
mvn clean package
如果是 Gradle:
export GRADLE_OPTS="-Xmx2g"
或修改 gradle.properties:
org.gradle.jvmargs=-Xmx2g
java -Xms512m -Xmx2g -jar app.jar
常用参数说明:
-Xms:初始堆内存-Xmx:最大堆内存-XX:MaxMetaspaceSize=512m(JDK8+)强烈建议加 Swap
# 创建 2G swap
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo mkswap /swapfile
sudo swapon /swapfile
# 开机自动挂载
echo '/swapfile swap swap defaults 0 0' >> /etc/fstab
查看:
free -h
mvn -T 1C clean package
或
mvn -o clean package
(-o 离线模式,少网络 IO)
org.gradle.parallel=false
org.gradle.daemon=false
查看:
java -version
| 现象 | 解决 |
|---|---|
Java heap space |
加大 -Xmx |
Metaspace |
加 -XX:MaxMetaspaceSize |
| 编译直接被 kill | 加 Swap |
| 卡死不动 | 降并行、加内存 |
如果你愿意,可以告诉我:
我可以给你精确命令。