在OutOfMemoryError的情况下Java进程的行为

时间:2011-09-30 06:57:40

标签: java jvm out-of-memory

获取OutOfMemoryError时Java程序的行为是什么?有没有明确的行为?流程会崩溃还是会进入等待/睡眠状态?

更新:如果我没有在我的代码中处理它?<​​/ p>

3 个答案:

答案 0 :(得分:14)

并且OutOfMemoryError的处理方式与其他任何例外一样:

  • 如果它被抓住了,那么就不会发生任何事了。
  • 如果未捕获,则threadsthreads groups未捕获的异常处理程序会处理它。这几乎总是导致线程停止。

然而有两个因素在其他例外中并不存在:

  • OutOfMemoryErrorError而不是Exception。这意味着它非常不可能被捕获到任何地方:你不应该试图一般地捕获Error(极少数例外)并且通常不会这样做,因此它被处理的可能性很小相当低。
  • OutOfMemoryError发生并且没有任何对象因此而有资格获得GC时,那么你仍然几乎没有内存,很可能你会遇到完全相同的以后再问题。

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

所以 tl; dr 是:它可能杀死线程,如果内存问题没有解决,那么这可能发生在越来越多的线程上

答案 1 :(得分:1)

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

答案 2 :(得分:1)

OutOfMemoryError应该被认为是不可恢复的,并且在引发这样的错误之后JVM的行为是未定义的,因此没有必要花费精力来处理它。在JVM抛出此异常之后执行的任何操作都将具有未定义的行为。它们可能会执行,但更可能的是它们只会引发另一个错误。