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

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

更新:如果我没有在我的代码中处理它?

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

  • 如果它被捕获,那么就不会发生任何事情。
  • 如果未捕获,则线程或线程组未捕获的exception处理程序处理它。 这几乎总是导致线程被停止。

但是 ,有两个因素在其他例外中并不存在:

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

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

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

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

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