在 Ubuntu 上遇到 Java 内存不足(OutOfMemoryError),通常可以从 JVM 参数调整、系统资源、代码优化 三个方面来解决。下面按常见场景给你讲清楚。
Java 常见内存问题有:
java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Metaspace
java.lang.StackOverflowError
killed(dmesg 中看到 Out of memory: Kill process)
java -Xms512m -Xmx2048m -jar app.jar
说明:
-Xms:初始堆内存-Xmx:最大堆内存✅ 推荐:
Xmx 设为物理内存的 1/4Xmx 不超过物理内存的 70%查看内存:
free -h
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
适合:
-Xss256k
适合:
StackOverflowErrorjava \
-Xms1g \
-Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-Xss256k \
-jar app.jar
dmesg | grep -i oom
如果出现:
Out of memory: Kill process 1234 (java)
说明 不是 JVM 问题,是系统内存不够
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
top
htop
关掉不必要的服务(如 MySQL、Docker 等)
jmap -heap <pid>
jstat -gc <pid>
# 查看 Java 进程
jps
# 查看内存使用
jstat -gcutil <pid> 1000
# 导出堆快照
jmap -dump:live,format=b,file=heap.hprof <pid>
# 分析工具
jhat heap.hprof
# 或 VisualVM / MAT
一定要加:
-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70
示例:
java -XX:MaxRAMPercentage=70 -jar app.jar
如果你愿意,可以告诉我:
我可以直接帮你给一套精准配置。