JVM是否在OutOfMemoryError之后终止自身

时间:2012-04-26 06:00:47

标签: java

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

5 个答案:

答案 0 :(得分:12)

OutOfMemoryError不会终止JVM。

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

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

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

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

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

如果你处理错误,通常只是在停止JVM之前尝试进行一些清理。在大多数情况下,尝试从OutOfMemoryError恢复是个坏主意。有关详细信息,请参阅此处:Can the JVM recover from an OutOfMemoryError without a restart

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

有两种资格

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