繁体   English   中英

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

[英]Behavior of a Java process in case of OutOfMemoryError

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

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

并且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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM