2011-09-30 60 views

回答

12

而且OutOfMemoryError像任何其他异常处理:

  • 如果抓住了,再没有什么更多的情况。
  • 如果它未被捕获,则threadsthreads groups未捕获异常处理程序处理它。这几乎总是导致线程停止。

然而有两个因素是不是真的存在其他异常:

  • OutOfMemoryErrorError而不是Exception。这意味着它几乎不可能在任何地方被捕获:你不应该试图捕捉一般的Error(只有极少数例外),而且通常不会完成,所以它被处理的可能性相当低。
  • 如果发生OutOfMemoryError并且没有任何对象因此而变得适用于GC,那么您将仍然剩下的内存很少,并且可能会在稍后再遇到完全相同的问题。

如果线程发生这种情况,是唯一的非守护线程(通常,但不一定,这是主线程,执行该main方法),那么该线程被杀导致整个JVM关闭(通常被认为是“崩溃”)。

所以TL;博士是:它将可能杀死线程,如果内存的问题不解决,那么这可能发生在越来越多的线程。

+0

对于“唯一的非守护进程线程”+1,尽管我猜测主线程在任何情况下都很快就会注定会出现“OutOfMemoryError”。 – Raedwald

+1

@ Raedwald:这很容易发生,但不一定是这种情况:有时栈的展开使得有足够的对象有资格获得GC,以至于内存不足情况只能由GC解决。例如,如果由于OOM错误导致大量数据导入失败,则可能会发生应用程序的其余部分不受影响地继续(但可能运气不佳并首先在另一部分中得到OOM错误)。 –

+0

好点。对于多线程服务器,实际上你需要这种行为,所以一个大的请求本身就会自己而不是杀死服务器。 – Raedwald

1

发生OutOfMemoryError时无法确定程序的状态。如果你没有捕获Throwable,那么你的程序将以栈跟踪结束。即使你正在捕获Throwable,你也应该调用System.exit,因为没有必要从中恢复。 “错误”通常由JVM抛出,与Exception相反,这是应用程序/程序员特定的。

1

OutOfMemoryError应该被认为是不可恢复的,在发生这种错误后JVM的行为是未定义的,所以没有必要费力去处理它。 JVM引发此异常后执行的任何操作都将具有未定义的行为。他们可能会执行,但更有可能他们只会导致另一个错误被抛出。

相关问题