JVM在OutOfMemoryError 之后终止自身

在OutOfMemoryError之后,JVM会自行终止吗? 如果不是那么为什么? 它会尝试恢复资源吗? 或者还有其他原因吗?

OutOfMemopryError不会终止JVM。

如果它未被捕获,它将终止发起错误的THREAD。 其他线程保持正常运行,除非它们当然也会导致OutOfMemoryErrors。

只有在所有线程终止或所有剩余线程都是守护线程之后,JVM才会终止。

它不会终止JVM,因为它不必。 终止JVM是一项非常极端的操作,并且不会轻易执行。

它不会尝试获取任何资源,因为没有任何东西可以检索。 抛出OOME的原因就是:JVM无法获取资源,因为所有资源都被占用了。 它已经做了所有其他事情。

必须记住,OOME不一定会抛入消耗最多内存的线程中。 线程可以占用所有内存并将处理权交给另一个尝试分配“只有一个字节”的线程。 Thas当然会失败,试图分配一个字节的线程被OOME中断。 这就是为什么几乎不可能从OOME恢复的原因。

JVM终止iff(与任何其他exception或错误一样),它不会被捕获到任何地方,并且没有其他线程是守护程序线程。

它不会立即终止,因为可以捕获OutOfMemoryError并且应用程序可以尝试执行一些error handling,从仅记录错误到解除该计算并以其他方式正常继续。

当出现错误时后者被认为是有风险的,但通常可能没有任何问题,因为很多对象可能超出OutOfMemoryError位置和捕获它的位置之间的范围,然后可以通过垃圾收集释放它们程序新的内存使用。 如果发生了OutOfMemoryError因为一个特定的计算需要的内存比可用内存多,并且应用程序之后会执行其他操作,那很好。

这取决于您是否处理该错误。 如果不这样做,那么应用程序和当前带有它的线程将被终止。 如果这个线程碰巧是最后一个正在运行的线程(在大多数情况下是当前应用程序的主线程),那么JVM也将退出(尽管它可能仍然会执行一些日志记录,在退出之前创建内存转储等)。

如果你处理错误,通常只是在停止JVM之前尝试进行一些清理。 在大多数情况下,尝试从OutOfMemoryError恢复是个坏主意。 有关更多详细信息,请参阅此处: JVM是否可以在不重新启动的情况下从OutOfMemoryError中恢复

它不会自行终止,它只是抛出一个错误,说它不能创建任何更多的对象,因为内存不可用,虽然你可以通过处理错误继续代码,但你必须只使用当前创建的对象生存,或者可能会释放或取消您不再需要的那些。

PS:但它不是推荐的处理此类错误的方法并继续进行

通常,JVM仅在最后一个非守护程序线程退出时终止。 抛出OutOfMemoryError或任何其他类型的Error或Exception可能导致最后一个非守护程序线程在未被捕获时存在。

但是,如果捕获错误而不是重新抛出错误或者正在运行另一个非守护程序线程,则JVM不会退出。 即,导致程序退出的任何特定错误都没有什么特别之处。

有两个资格

  • System.exit()将导致JVM开始关闭并且无法捕获。 拥有多个线程没有任何区别。
  • ThreadDeath错误的特殊之处在于默认情况下不会打印它。 否则它的行为与任何其他错误相同。