【八股文Java】: OOM后,JVM一定会退出吗?为什么?

2023-10-20 15:36:23 浏览数 (1)

问:OOM后,JVM一定会退出吗?为什么?

答:OOM后,JVM不一定退出。

JVM退出的条件是:所有非守护线程退出,或者某些异常导致操作系统杀死当前进程。

OOM异常也是Java异常的一种,默认情况下,如果是某个线程抛出异常,此线程会退出,并且异常堆栈会输出到控制台。如果JVM所有的非守护线程都因为OOM异常或者其他异常退出,那么JVM就会退出

进程是资源分配的单位,线程是资源调度的基本单位。

JVM中异常的处理都会和线程绑定,也就是说线程也起到了故障隔离作用,如下图:

Java中线程抛出了异常且导致退出时,如果我们不处理异常,会有默认的java.lang.Thread.UncaughtExceptionHandler处理。如果当前线程没有配置UncaughtExceptionHandler,会有线程组(ThreadGroup)兜底处理(线程退出后,会将异常堆栈输出到控制台)

代码语言:javascript复制
java.lang.Thread#getUncaughtExceptionHandler

当然,线程是宝贵的资源,一般以线程池的方式使用,我们需要自己处理异常,不要让线程退出,避免重复创建线程

附:

模拟OOM,一个线程OOM后退出,其他线程正常运行:

运行结果:

0 人点赞