温馨提示×

ubuntu java内存不足咋办

小樊
44
2026-09-16 08:01:55
栏目: 编程语言

在 Ubuntu 上运行 Java 程序时提示内存不足(OutOfMemoryError / 被系统 kill),可以按下面步骤排查和解决。


一、先确认是哪种“内存不足”

1. Java 自身 OOM(堆内存不够)

典型错误:

java.lang.OutOfMemoryError: Java heap space

说明:JVM 堆内存设置太小。

✅ 解决:增大堆内存

java -Xms512m -Xmx2g -jar yourapp.jar
  • -Xms:初始堆
  • -Xmx:最大堆(重要)

2. 被系统杀掉(OOM Killer)

现象:

  • Java 进程突然消失
  • dmesg 中有:
Out of memory: Kill process xxxx (java)

说明:系统物理内存 + Swap 不够。

✅ 查看系统日志:

dmesg | grep -i oom

二、Ubuntu 系统级优化

1. 查看内存使用情况

free -h
top
htop

2. 增加 Swap(最常见解决办法)

如果没 Swap 或太小:

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

3. 减少系统占用

  • 关闭不必要的服务
systemctl list-units --type=service
  • 不要用桌面环境跑 Java 服务(用 Server 版更好)

三、JVM 参数优化(重点)

1. 限制总内存(避免吃掉系统)

java -Xmx2g -XX:MaxRAM=3g -jar app.jar

2. 使用 G1 垃圾回收器(稳定)

java -Xmx2g -XX:+UseG1GC -jar app.jar

3. 容器 / 云服务器专用

如果是 Docker:

java -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 -jar app.jar

四、代码层面问题

内存不足也可能是代码问题:

  • 死循环创建对象
  • 集合未清理(List / Map 一直 add)
  • 大文件一次性读入内存

✅ 排查工具:

jstat -gc <pid>
jmap -heap <pid>
jstack <pid>

生成堆转储:

jmap -dump:format=b,file=heap.hprof <pid>

用 VisualVM / MAT 分析。


五、快速自检清单 ✅

  • [ ] -Xmx 是否设置合理
  • [ ] 是否有 Swap
  • [ ] 是否被 OOM Killer 杀掉
  • [ ] 是否有内存泄漏
  • [ ] 是否系统内存太小(< 2G 跑大型 Java 服务)

如果你愿意,可以告诉我:

  • Ubuntu 版本
  • 内存大小
  • Java 版本
  • 报错完整信息

我可以帮你给一套精准配置

0