Поведение процесса Java в случае OutOfMemoryError - PullRequest
8 голосов
/ 30 сентября 2011

Как будет вести себя программа на Java при получении OutOfMemoryError .Есть ли определенное поведение?Произойдет ли сбой процесса или он перейдет в состояние ожидания / сна?

Обновление: , если я не обрабатываю его в своем коде?

Ответы [ 3 ]

14 голосов
/ 30 сентября 2011

И OutOfMemoryError обрабатывается как любое другое исключение:

  • Если он пойман, больше ничего не происходит.
  • Если он не перехвачен, то обработчик исключений исключений *1000* * *1000* групп * *1000* обрабатывает его. Это почти всегда приводит к остановке потока.

Однако есть два фактора, которых на самом деле нет в других исключениях:

  • OutOfMemoryError является Error, а не Exception. Это означает, что очень маловероятно , чтобы быть пойманным где-либо: Вы не должны пытаться поймать Error вообще (с очень немногими исключениями), и это обычно не делается, поэтому шансы на его обработку довольно низки .
  • Когда происходит OutOfMemoryError и из-за этого ни один объект не подходит для GC, у вас все еще остается мало памяти, и есть вероятность, что вы снова столкнетесь с той же проблемой позже на.

И если поток, с которым это происходит, является единственным потоком, не являющимся демоном (часто, но не обязательно, это основной поток, который выполняет метод main), то этот поток, завершающий работу, приводит к завершению всей JVM (что часто воспринимается как «авария»).

Таким образом, tl; dr : Это , вероятно, уничтожит поток, и если проблема с памятью не будет решена, то это может произойти со все большим количеством потоков.

1 голос
/ 30 сентября 2011

OutOfMemoryError следует считать невосстановимым, и поведение JVM после возникновения такой ошибки не определено, поэтому нет смысла прилагать дополнительные усилия для ее устранения. Любые операции, выполненные после того, как JVM сгенерирует это исключение, будут иметь неопределенное поведение. Они могут выполняться, но, скорее всего, они просто вызовут другую ошибку.

1 голос
/ 30 сентября 2011

Вы не можете определить состояние программы, когда происходит OutOfMemoryError. Если вы не перехватываете Throwable, ваша программа завершит работу с помощью трассировки стека. Даже если вы перехватываете Throwable, вы должны вызвать System.exit, так как нет смысла восстанавливаться после него. «Ошибка», как правило, выдается JVM, в отличие от Exception, которая зависит от приложения / программиста.

...