OutOfMemoryError
OutOfMemoryError
背景
-
JVM的Error
定义
OutOfMemoryError是 JVM 抛出的一种严重错误(Error),而非普通异常(Exception),它表示:JVM 已经没有足够的内存空间来满足新的内存分配请求,且垃圾回收器(GC)也无法回收出足够的可用内存。简单说就是:JVM 内存 “不够用了”,且 “腾不出空间”,程序无法继续运行,只能抛出这个错误并终止相关线程(严重时会导致整个应用崩溃)。
出现OutOfMemoryError原因
- JVM 的内存空间分为多个区域(堆、方法区 / 元空间、虚拟机栈、本地方法栈、程序计数器),除了程序计数器,其他区域都可能因为内存不足抛出 OOM,核心原因主要有两类:
- 内存泄漏:对象不再被使用,但垃圾回收器无法回收它们(比如长生命周期的集合持有短生命周期对象的引用),导致内存被持续占用,最终耗尽。、
- 内存溢出:程序正常使用的内存超过了 JVM 配置的内存上限(比如堆内存设置太小,但业务需要创建大量对象)。
程序计数器不会抛出OOM的原因
- 内存占用极小:程序计数器只存储指令地址(一个整数),占用的内存空间是固定的、微乎其微的,不会随着程序运行而增长。
- 功能单一:它只记录当前线程的指令地址,没有动态内存分配的行为,自然不会出现 “内存不足” 的情况。
总结
OutOfMemoryError是 JVM 内存耗尽且 GC(Garbage Collection,垃圾回收) 无法回收足够空间时抛出的严重错误,会导致程序无法继续运行;- 除了程序计数器,JVM 堆、栈、元空间等区域都可能触发 OOM,其中堆 OOM 是最常见的场景;
- 程序计数器因内存占用固定、无动态分配行为,是唯一不会抛出 OOM 的 JVM 运行时数据区。