Java堆内存溢出(OOM)时会调用Shutdown Hook吗?
Java堆OOM与JVM中止、Shutdown Hook执行的关系
核心结论
堆内存耗尽抛出OutOfMemoryError时,JVM不会直接中止,这种错误的可恢复性足够强,通常能正常执行Shutdown Hook。
具体细节
- JVM中止仅触发于两种场景:外部强制终止(如Unix系统的SIGKILL信号、Windows系统的TerminateProcess调用),或本地方法异常导致内部数据结构损坏/非法内存访问。堆OOM属于Java层面的受控错误,是JVM在内存分配失败时抛出的标准错误,不会破坏JVM核心内部结构,也不属于本地方法异常引发的中止场景。
- 只要JVM进入正常关闭流程(哪怕是OOM后程序无法继续运行最终走向关闭),Shutdown Hook都会被执行。极端罕见的例外情况:如果OOM恰好发生在Shutdown Hook执行过程中,或者OOM导致线程完全无法调度,才可能影响钩子执行,但常规堆OOM场景下无需担心。
OutOfMemoryError是Error类型,但JVM并未强制要求程序必须退出。如果程序能捕获该错误并释放部分内存,理论上可继续运行;但实际多数场景下程序会无法正常工作,最终主动或被动退出,这个过程属于干净的关闭流程。
内容的提问来源于stack exchange,提问作者cozos
相关产品推荐
相关产品推荐

