温馨提示×

ubuntu java内存溢出怎么解

小樊
38
2026-09-22 09:16:30
栏目: 编程语言

在 Ubuntu 上遇到 Java 内存溢出(OutOfMemoryError),可以从「排查原因」和「解决办法」两方面入手。下面给你一个实用指南。


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

Java 常见 OOM 类型:

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

查看错误日志示例:

java.lang.OutOfMemoryError: Java heap space

二、快速排查手段(Ubuntu 环境)

1. 查看 JVM 内存参数

ps -ef | grep java

或

jps -l
jinfo <pid>

2. 查看内存使用情况

free -h
top
htop

3. 生成并分析堆转储(非常重要)

启动时加参数:

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

用工具分析:

  • Eclipse MAT
  • VisualVM
  • jhat(简单用)

三、常见解决方案

✅ 1. 堆内存不足(最常见)

加大堆内存:

java -Xms512m -Xmx2g -jar app.jar

Ubuntu 服务器建议:

  • 物理内存 4G → -Xmx2g
  • 物理内存 8G → -Xmx4g

✅ 2. Metaspace 溢出(Spring / 热部署常见)

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

✅ 3. 线程数过多

错误:

Unable to create new native thread

解决:

  • 减少线程池大小
  • 提高系统限制

Ubuntu 查看限制:

ulimit -u

修改:

sudo vi /etc/security/limits.conf
* soft nproc 4096
* hard nproc 8192

✅ 4. 直接内存溢出(Netty / NIO)

-XX:MaxDirectMemorySize=512m

✅ 5. 代码层面优化(根治)

  • 避免死循环创建对象
  • 及时关闭流 / 连接
  • 使用对象池(线程池、连接池)
  • 避免在静态变量中存大对象

四、推荐的标准 JVM 参数模板

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

五、如果你愿意,我可以进一步帮你

你可以补充:

  1. 完整报错信息
  2. Java 版本(java -version)
  3. Ubuntu 版本
  4. 应用类型(Spring Boot / Tomcat / 自写程序)

我可以直接帮你 定位是哪种 OOM,并给出精确参数和代码修改建议。

0 踩