Как умирает JVM из-за исключения OOM? - PullRequest
0 голосов
/ 27 апреля 2020

Я просмотрел множество мест и не смог найти причину для JVM до d ie из-за OOM. Я не рассматриваю убийцу ОС. Чтобы дать некоторый контекст, у меня запущено приложение Java, и оно начинает исчерпывать память, я знаю, что оно может выжить после того, как JVM начнет убивать потоки.

Тем не менее, я видел, что он работает более 30 минут после первого OOM, и он продолжает работать в этом неотвечающем состоянии, он может восстановиться или не восстановиться. Но я также видел его сбой сразу после первого OOM после репликации тех же шагов для запуска OOM. Система в порядке со стороны памяти, проблема только с JVM. Итак, у меня следующие вопросы:

  1. Что происходит с JVM во время OOM, когда он может взломать sh или остаться в бездействующем состоянии?
  2. Как JVM уничтожает потоки? Это случайно?

1 Ответ

1 голос
/ 27 апреля 2020

Технически, OutOfMemoryError - это «просто еще один бросаемый объект», поэтому он может или не может уничтожить поток, в который он вбрасывается, в зависимости от того, как этот поток обрабатывает свои исключения.

Например, если у него блок catch (Error e) на самом низком уровне, он может "противостоять" множеству проблем во время работы.

Так что, если ваш OutOfMemoryError добавляется только в потоки, которые обрабатывают ошибки как это изящно, тогда ваша система может продолжать нормально работать.

Но именно здесь вступает в игру 2 необычное свойство OutOfMemoryError:

  1. Может быть выброшено в основном в любом месте , где выделена память и где точно будет выброшено, настолько непредсказуемо, что выглядит случайным. часто выбрасывается в место, которое выделяет наибольшее количество памяти, но это далеко не всегда так.
  2. Из-за характера ошибки, которое она представляет, вполне возможно столкнуться с точным та же ошибка снова при попытке обработать исключение (например, вам может не хватить памяти при попытке сгенерировать сообщение журнала о нехватке памяти). Этот рекурсивный характер делает надёжное обращение с OOME невероятно трудным.

Так что tl; dr ответы на ваши вопросы:

  1. "it зависит "от того, что ваши потоки делают для обработки исключений
  2. Потоки будут убиты, если не обработать либо исходное исключение, либо не обработать исключение, которое происходит при попытке обработать исходное. Какой поток получает удар настолько непредсказуемо, что выглядит случайным.
...