温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

为什么java会内存溢出

发布时间:2026-09-19 03:48:17 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

Java 出现内存溢出(OutOfMemoryError,简称 OOM),本质上只有一个原因:JVM 向操作系统申请内存失败,也就是“该用的内存用完了,还想要更多,但给不了”。

下面从原理 → 常见原因 → 典型场景 → 解决思路讲清楚。


一、Java 内存模型简图(先有概念)

Java 内存主要分这几块(HotSpot):

  1. 堆(Heap)
    • 存放对象实例
    • 最常见 OOM 发生地
  2. 方法区 / 元空间(Metaspace)
    • 类信息、常量、静态变量
  3. 栈(Stack)
    • 线程私有,存放方法调用
  4. 直接内存(Direct Memory)
    • NIO 使用,不受堆限制

二、最常见的内存溢出类型

1️⃣ 堆内存溢出(最常见)

报错:

java.lang.OutOfMemoryError: Java heap space

原因:

  • 对象一直被引用,无法被 GC 回收
  • 数据量过大(缓存、集合)
  • 内存泄漏(Memory Leak)

典型例子:

List<byte[]> list = new ArrayList<>();
while (true) {
    list.add(new byte[1024 * 1024]);
}

✅ 解决:

  • 增大堆: -Xmx2g
  • 优化代码(及时释放引用)
  • 使用弱引用 / 缓存淘汰策略

2️⃣ 元空间溢出(JDK 8+)

报错:

java.lang.OutOfMemoryError: Metaspace

原因:

  • 动态生成类过多(反射、CGLIB、代理)
  • 类加载器泄漏

典型场景:

  • Spring / MyBatis 动态代理
  • 热部署频繁

✅ 解决:

  • 增大元空间:-XX:MaxMetaspaceSize=256m
  • 避免重复创建类加载器

3️⃣ 栈溢出(其实不算典型 OOM)

报错:

java.lang.StackOverflowError

原因:

  • 无限递归
  • 线程栈太小
void a() { a(); }

✅ 解决:

  • 改写递归为循环
  • 增大栈:-Xss512k

4️⃣ 直接内存溢出

报错:

java.lang.OutOfMemoryError: Direct buffer memory

原因:

  • Netty / NIO 使用直接内存
  • 未释放 ByteBuffer

✅ 解决:

  • 控制 DirectByteBuffer 使用
  • 设置:-XX:MaxDirectMemorySize

5️⃣ 创建线程过多

报错:

java.lang.OutOfMemoryError: unable to create new native thread

原因:

  • 线程数超过系统限制
  • 线程池配置错误

✅ 解决:

  • 使用线程池
  • 减少线程数

三、为什么“内存还有,却溢出?”

常见错觉:

“我看服务器还有内存啊,怎么 Java 挂了?”

原因:

  • JVM 有最大内存限制(-Xmx)
  • 操作系统内存 ≠ JVM 可用内存
  • 内存被长期引用导致 GC 无效

四、如何排查 Java 内存溢出?

1️⃣ 加 JVM 参数

-Xmx512m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heap.hprof

2️⃣ 用工具分析

  • MAT(Eclipse Memory Analyzer)
  • jvisualvm
  • arthas

3️⃣ 看什么?

  • 哪个对象占用最多
  • 谁引用了它(GC Roots)
  • 是否是缓存 / 静态集合

五、一句话总结

Java 内存溢出 = 内存申请超过 JVM 限制 或 内存无法被回收

如果你愿意,可以:

  • 发一段报错信息
  • 或贴一段代码
  • 或说你用的是 Spring / Netty / 大数据

我可以帮你具体定位是哪一种 OOM。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手