在 Ubuntu 上用 javac 或 java 编译/运行 Java 程序时遇到内存不足(OutOfMemoryError / 编译卡死 / 被系统杀掉),可以按下面思路处理。
常见报错:
The system is out of resources.
Consult the following stack trace for details.
java.lang.OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
dmesg 里能看到:
Out of memory: Kill process xxxx (java) score xxx
javac -J-Xmx2g -J-Xms512m YourFile.java
如果是 Maven / Gradle:
export MAVEN_OPTS="-Xmx2g -Xms512m"
mvn compile
export GRADLE_OPTS="-Xmx2g -Xms512m"
或修改 gradle.properties:
org.gradle.jvmargs=-Xmx2g -Xms512m
java -Xms512m -Xmx2g -jar app.jar
常用参数说明:
-Xms:初始堆内存-Xmx:最大堆内存-XX:MaxMetaspaceSize=256m(类加载多时)Ubuntu 没 swap 或 swap 太小很容易炸。
free -h
swapon --show
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
docker run -e JAVA_OPTS="-Xmx512m" -m 1g my-java-app
如果是你自己代码:
List 无限增长Stream / BufferedReader)# 看内存
free -h
# 看是谁被杀了
dmesg | grep -i oom
# 看 java 进程
jps
top
如果你愿意,可以把:
free -h 输出javac 还是 java发给我,我可以直接给你精确参数配置。