温馨提示×

ubuntu java内存不足怎么调

小樊
34
2026-09-13 01:31:08
栏目: 编程语言

在 Ubuntu 上遇到 Java 内存不足(OutOfMemoryError),通常可以从 JVM 参数调整、系统资源、代码优化 三个方面来解决。下面按常见场景给你讲清楚。


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

Java 常见内存问题有:

  1. 堆内存不足
    java.lang.OutOfMemoryError: Java heap space
    
  2. 元空间不足(JDK8+)
    java.lang.OutOfMemoryError: Metaspace
    
  3. 栈内存不足
    java.lang.StackOverflowError
    
  4. 系统内存不足(被 OS 杀掉)
    killed(dmesg 中看到 Out of memory: Kill process)
    

二、调整 JVM 内存参数(最常见)

1️⃣ 调整堆内存(最常见)

java -Xms512m -Xmx2048m -jar app.jar

说明:

  • -Xms:初始堆内存
  • -Xmx:最大堆内存

✅ 推荐:

  • 开发环境:Xmx 设为物理内存的 1/4
  • 生产环境:Xmx 不超过物理内存的 70%

查看内存:

free -h

2️⃣ 调整元空间(JDK 8+)

-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=512m

适合:

  • 热部署
  • 大量类加载(Spring / 反射)

3️⃣ 调整线程栈大小

-Xss256k

适合:

  • 线程数非常多
  • StackOverflowError

4️⃣ 完整示例

java \
-Xms1g \
-Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-Xss256k \
-jar app.jar

三、Ubuntu 系统层面优化

1️⃣ 查看是否被系统杀掉

dmesg | grep -i oom

如果出现:

Out of memory: Kill process 1234 (java)

说明 不是 JVM 问题,是系统内存不够


2️⃣ 增加 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️⃣ 限制系统其他进程占用

top
htop

关掉不必要的服务(如 MySQL、Docker 等)


四、代码层面优化(根本解决)

✅ 常见原因

  • 内存泄漏(集合一直增长)
  • 大文件一次性读入内存
  • 缓存无上限
  • 线程池配置不合理

✅ 建议

  • 使用流式处理大文件
  • 限制缓存大小(如 Caffeine)
  • 定期检查:
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

六、如果是 Docker 中运行 Java

一定要加:

-XX:+UseContainerSupport
-XX:MaxRAMPercentage=70

示例:

java -XX:MaxRAMPercentage=70 -jar app.jar

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

  • Java 版本(java -version)
  • 运行方式(直接跑 / Docker / systemd)
  • 报错完整信息

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

0