在 Ubuntu 上遇到 Java 内存溢出(OutOfMemoryError),一般从定位原因 → 调整 JVM 参数 → 优化代码/配置三个层面来处理。下面给你一套实用做法。
Java 常见 OOM 类型:
查看错误日志:
cat /path/to/app.log | grep -i "OutOfMemory"
jps -l
jstat -gcutil <pid> 1000
jmap -heap <pid>
java -Xms512m -Xmx2048m -jar app.jar
说明:
-Xms:初始堆大小-Xmx:最大堆大小建议
Xmx 设为物理内存的 50%~70%-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
或(JDK 11+):
-XX:+UseZGC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heapdump.hprof
分析工具:
free -h
dmesg | grep -i "killed process"
docker stats
并设置:
-e JAVA_OPTS="-Xmx1024m"
-XX:ThreadStackSize=256k
减少线程池大小
-XX:MaxDirectMemorySize=256m
java \
-Xms1g \
-Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/heapdump.hprof \
-jar app.jar
你可以告诉我:
我可以给你精准参数配置或代码优化建议。