И OutOfMemoryError
обрабатывается как любое другое исключение:
- Если он пойман, больше ничего не происходит.
- Если он не перехвачен, то обработчик исключений исключений *1000* * *1000* групп * *1000* обрабатывает его. Это почти всегда приводит к остановке потока.
Однако есть два фактора, которых на самом деле нет в других исключениях:
OutOfMemoryError
является Error
, а не Exception
. Это означает, что очень маловероятно , чтобы быть пойманным где-либо: Вы не должны пытаться поймать Error
вообще (с очень немногими исключениями), и это обычно не делается, поэтому шансы на его обработку довольно низки .
- Когда происходит
OutOfMemoryError
и из-за этого ни один объект не подходит для GC, у вас все еще остается мало памяти, и есть вероятность, что вы снова столкнетесь с той же проблемой позже на.
И если поток, с которым это происходит, является единственным потоком, не являющимся демоном (часто, но не обязательно, это основной поток, который выполняет метод main
), то этот поток, завершающий работу, приводит к завершению всей JVM (что часто воспринимается как «авария»).
Таким образом, tl; dr : Это , вероятно, уничтожит поток, и если проблема с памятью не будет решена, то это может произойти со все большим количеством потоков.