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

Ume*_*yat 8 java jvm out-of-memory

什么是对得到一个Java程序的行为的OutOfMemoryError.有没有明确的行为?进程是崩溃还是进入等待/睡眠状态?

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

Joa*_*uer 14

OutOfMemoryError像任何其他异常一样处理:

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

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

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

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

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