JVM 有那几种情况会产生 OOM(内存溢出)?

JVM 有哪些情况会产生 OOM(内存溢出)?

JVM 的内存溢出(OutOfMemoryError, OOM)是指程序在运行过程中,JVM 无法从操作系统申请到足够的内存,导致程序抛出内存溢出异常。OOM 可能发生在不同的内存区域,以下是常见的几种情况:

1. Java 堆内存溢出

发生原因

  • 对象创建过多:当程序创建大量对象,并且没有及时回收,堆内存无法容纳更多对象时,会发生堆内存溢出。
  • 内存泄漏:某些对象仍然被引用,无法被垃圾回收器清理,导致内存持续占用。
  • 高并发场景:多线程环境下,频繁的对象创建和销毁可能导致堆内存的紧张。

错误信息

java.lang.OutOfMemoryError: Java heap space

2. 方法区内存溢出(JDK 7 及之前)

发生原因

  • 类加载过多:动态生成类过多,导致方法区(永久代)的内存不足。
  • 静态变量占用过多内存:类的静态字段占用大量内存。
  • 运行时常量池过大:常量池中存储大量常量数据(如字符串等)。

错误信息

java.lang.OutOfMemoryError: PermGen space

3. 元空间(Metaspace)内存溢出(JDK 8 及之后)

发生原因

  • 类加载过多:JDK 8 之后,方法区的实现改为元空间,它使用本地内存,加载过多类会导致元空间溢出。
  • 静态变量过多:元空间中存储类的元数据,如果静态变量过多,会占用大量内存。

错误信息

java.lang.OutOfMemoryError: Metaspace

4. 栈内存溢出

发生原因

  • 递归调用过深:方法调用过深,栈内存被耗尽。
  • 线程栈大小过小:线程栈的大小设置不当,可能导致栈内存不足。

错误信息

java.lang.StackOverflowError

5. Direct Memory(直接内存)溢出

发生原因

  • 使用 NIO(New I/O)时分配大量直接内存:通过 ByteBuffer.allocateDirect() 创建的直接内存超出了可用内存的限制。

错误信息

java.lang.OutOfMemoryError: Direct buffer memory

6. 本地方法栈溢出

发生原因

  • 本地方法调用栈过深:本地方法栈在调用 C/C++ 等本地方法时,如果调用过深或分配过多本地内存,也会导致内存溢出。

错误信息

java.lang.OutOfMemoryError: Native memory allocation (mmap) failed to map
posted @   Eiffelzero  阅读(114)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
历史上的今天:
2022-12-10 1691. 堆叠长方体的最大高度
点击右上角即可分享
微信分享提示