Java程序在获取OutOfMemoryError时的行为如何。有没有定义的行为?该进程是否会崩溃或将进入等待/睡眠状态?发生OutOfMemoryError时的Java进程行为
更新:如果我没有在我的代码中处理它?
Java程序在获取OutOfMemoryError时的行为如何。有没有定义的行为?该进程是否会崩溃或将进入等待/睡眠状态?发生OutOfMemoryError时的Java进程行为
更新:如果我没有在我的代码中处理它?
而且OutOfMemoryError
像任何其他异常处理:
然而有两个因素是不是真的存在其他异常:
OutOfMemoryError
是Error
而不是Exception
。这意味着它几乎不可能在任何地方被捕获:你不应该试图捕捉一般的Error
(只有极少数例外),而且通常不会完成,所以它被处理的可能性相当低。OutOfMemoryError
并且没有任何对象因此而变得适用于GC,那么您将仍然剩下的内存很少,并且可能会在稍后再遇到完全相同的问题。如果线程发生这种情况,是唯一的非守护线程(通常,但不一定,这是主线程,执行该main
方法),那么该线程被杀导致整个JVM关闭(通常被认为是“崩溃”)。
所以TL;博士是:它将可能杀死线程,如果内存的问题不解决,那么这可能发生在越来越多的线程。
发生OutOfMemoryError时无法确定程序的状态。如果你没有捕获Throwable,那么你的程序将以栈跟踪结束。即使你正在捕获Throwable,你也应该调用System.exit,因为没有必要从中恢复。 “错误”通常由JVM抛出,与Exception相反,这是应用程序/程序员特定的。
OutOfMemoryError应该被认为是不可恢复的,在发生这种错误后JVM的行为是未定义的,所以没有必要费力去处理它。 JVM引发此异常后执行的任何操作都将具有未定义的行为。他们可能会执行,但更有可能他们只会导致另一个错误被抛出。
与一个OOM错误睡觉会有什么好处? –