在OutOfMemoryError之后,JVM会自行终止吗?如果不是那么为什么?它会尝试恢复资源吗?或者还有其他原因吗?
答案 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不会退出。即,导致程序退出的任何特定错误都没有什么特别之处。
有两种资格