温馨提示×

ubuntu java内存溢出怎么调

小樊
52
2026-09-04 01:16:18
栏目: 编程语言

在 Ubuntu 上遇到 Java 内存溢出(OutOfMemoryError),一般从定位原因 → 调整 JVM 参数 → 优化代码/配置三个层面来处理。下面给你一套实用做法。


一、先确认是哪种内存溢出

Java 常见 OOM 类型:

  1. Java heap space(堆内存不足)
  2. Metaspace / PermGen(类元数据)
  3. GC overhead limit exceeded(GC 频繁但回收少)
  4. Unable to create new native thread(线程过多)
  5. Direct buffer memory(NIO 直接内存)

查看错误日志:

cat /path/to/app.log | grep -i "OutOfMemory"

二、查看当前 Java 内存使用情况

1. 查看进程

jps -l

2. 查看内存占用

jstat -gcutil <pid> 1000

3. 查看堆配置

jmap -heap <pid>

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

1. 堆内存(最重要)

java -Xms512m -Xmx2048m -jar app.jar

说明:

  • -Xms:初始堆大小
  • -Xmx:最大堆大小

建议

  • 生产环境:Xmx 设为物理内存的 50%~70%
  • 容器环境注意不要超过容器限制

2. Metaspace(JDK 8+)

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

3. 垃圾回收器(大内存推荐)

-XX:+UseG1GC

或(JDK 11+):

-XX:+UseZGC

4. 生成 OOM 快照(非常重要)

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/heapdump.hprof

分析工具:

  • Eclipse MAT
  • VisualVM
  • jhat

四、Ubuntu / 系统层面注意

1. 查看系统内存

free -h

2. 查看是否被系统杀掉

dmesg | grep -i "killed process"

3. 如果是 Docker

docker stats

并设置:

-e JAVA_OPTS="-Xmx1024m"

五、线程 / 直接内存问题

线程过多

-XX:ThreadStackSize=256k

减少线程池大小

NIO 直接内存

-XX:MaxDirectMemorySize=256m

六、示例完整 JVM 参数(推荐)

java \
-Xms1g \
-Xmx2g \
-XX:MetaspaceSize=128m \
-XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/heapdump.hprof \
-jar app.jar

七、下一步我可以帮你

你可以告诉我:

  1. 报错完整信息(哪一行 OOM)
  2. 用的 JDK 版本
  3. 是否在 Docker / Spring Boot / Tomcat
  4. 服务器内存大小

我可以给你精准参数配置或代码优化建议

0