获取OutOfMemoryError时Java程序的行为是什么?有没有明确的行为?流程会崩溃还是会进入等待/睡眠状态?
更新:如果我没有在我的代码中处理它?</ p>
答案 0 :(得分:14)
并且OutOfMemoryError
的处理方式与其他任何例外一样:
然而有两个因素在其他例外中并不存在:
OutOfMemoryError
是Error
而不是Exception
。这意味着它非常不可能被捕获到任何地方:你不应该试图一般地捕获Error
(极少数例外)并且通常不会这样做,因此它被处理的可能性很小相当低。OutOfMemoryError
发生并且没有任何对象因此而有资格获得GC时,那么你仍然几乎没有内存,很可能你会遇到完全相同的以后再问题。如果发生这种情况的线程是唯一的非守护进程线程(通常,但不一定,那是执行main
方法的主线程),那么该线程被杀死会导致整个JVM关闭(通常被视为“崩溃”)。
所以 tl; dr 是:它可能杀死线程,如果内存问题没有解决,那么这可能发生在越来越多的线程上
答案 1 :(得分:1)
发生OutOfMemoryError时无法确定程序的状态。如果您没有捕获Throwable,那么您的程序将以stacktrace终止。即使您正在捕获Throwable,也应该调用System.exit,因为没有必要从中恢复。 “错误”通常由JVM抛出,与异常相反,异常是应用程序/程序员特定的。
答案 2 :(得分:1)
OutOfMemoryError应该被认为是不可恢复的,并且在引发这样的错误之后JVM的行为是未定义的,因此没有必要花费精力来处理它。在JVM抛出此异常之后执行的任何操作都将具有未定义的行为。它们可能会执行,但更可能的是它们只会引发另一个错误。