[英]Behavior of a Java process in case of OutOfMemoryError
并且OutOfMemoryError
的处理方式与任何其他异常一样:
但是 ,有两个因素在其他例外中并不存在:
OutOfMemoryError
是一个Error
而不是Exception
。 这意味着它不太可能被捕到任何地方:你不应该试图捕获一般的Error
(极少数例外)并且通常不会这样做,所以处理它的可能性相当低。 OutOfMemoryError
发生并且没有对象因此而有资格获得GC时,那么你仍然会留下很少的内存,并且可能会在以后再次遇到完全相同的问题。 如果发生这种情况的线程是唯一的非守护进程线程(通常,但不一定,这是执行main
方法的主线程),那么该线程被杀死会导致整个JVM关闭(通常被认为)作为“崩溃”)。
所以tl; dr是:它可能会杀死线程,如果内存问题没有解决,那么这可能发生在越来越多的线程上。
发生OutOfMemoryError时无法确定程序的状态。 如果您没有捕获Throwable,那么您的程序将以stacktrace终止。 即使您正在捕获Throwable,也应该调用System.exit,因为没有必要从中恢复。 “错误”通常由JVM抛出,与异常相反,异常是应用程序/程序员特定的。
应该认为OutOfMemoryError是不可恢复的,并且在引发此类错误之后JVM的行为是未定义的,因此没有必要花费精力来处理它。 在JVM抛出此异常之后执行的任何操作都将具有未定义的行为。 它们可能会执行,但更可能的是它们只会引发另一个错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.