在 Ubuntu 上遇到 Java 内存溢出(OutOfMemoryError),一般按下面思路处理和排查。
Java 常见 OOM 类型:
看错误日志里具体是哪一句。
编辑启动脚本或 systemd 配置:
java -Xms512m -Xmx2048m -jar app.jar
Ubuntu 上如果是 systemd 服务:
sudo systemctl edit your-app.service
添加:
[Service]
Environment="JAVA_OPTS=-Xms512m -Xmx2048m"
然后:
sudo systemctl daemon-reload
sudo systemctl restart your-app
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m
ulimit -uulimit -a
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/app/heapdump.hprof
OOM 后分析:
jhat heapdump.hprof
jstat -gcutil <pid> 1000
查看:
top -p <pid>
ps -eo pid,comm,rss,vsz
free -h
swapon --show
dmesg | grep -i "killed process"
JAVA_OPTS="-Xms1g -Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/oom.hprof \
-XX:+PrintGCDetails \
-Xloggc:/var/log/app/gc.log"
如果你愿意,可以把:
发出来,我可以帮你精准定位原因。