Технически, OutOfMemoryError
- это «просто еще один бросаемый объект», поэтому он может или не может уничтожить поток, в который он вбрасывается, в зависимости от того, как этот поток обрабатывает свои исключения.
Например, если у него блок catch (Error e)
на самом низком уровне, он может "противостоять" множеству проблем во время работы.
Так что, если ваш OutOfMemoryError
добавляется только в потоки, которые обрабатывают ошибки как это изящно, тогда ваша система может продолжать нормально работать.
Но именно здесь вступает в игру 2 необычное свойство OutOfMemoryError
:
- Может быть выброшено в основном в любом месте , где выделена память и где точно будет выброшено, настолько непредсказуемо, что выглядит случайным. часто выбрасывается в место, которое выделяет наибольшее количество памяти, но это далеко не всегда так.
- Из-за характера ошибки, которое она представляет, вполне возможно столкнуться с точным та же ошибка снова при попытке обработать исключение (например, вам может не хватить памяти при попытке сгенерировать сообщение журнала о нехватке памяти). Этот рекурсивный характер делает надёжное обращение с
OOME
невероятно трудным.
Так что tl; dr ответы на ваши вопросы:
- "it зависит "от того, что ваши потоки делают для обработки исключений
- Потоки будут убиты, если не обработать либо исходное исключение, либо не обработать исключение, которое происходит при попытке обработать исходное. Какой поток получает удар настолько непредсказуемо, что выглядит случайным.