Обнаружение ошибок нехватки памяти

Я хотел бы предоставить моей системе способ определения того, произошло ли исключение нехватки памяти или нет. Цель этого упражнения состоит в том, чтобы выставить этот флаг через JMX и действовать соответствующим образом (, например. настроив соответствующее оповещение в системе мониторинга ), иначе эти ошибки останутся незамеченными в течение нескольких дней.

Наивным подходом для этого было бы установить обработчик неперехваченных исключений для каждого потока и проверить, является ли возникшее исключение экземпляром OutOfMemoryError, и установить соответствующий флаг. Однако такой подход нереалистичен по следующим причинам:

  • Исключение может возникнуть где угодно, включая сторонние библиотеки. Я ничего не могу сделать, чтобы помешать им поймать Throwableи оставить себе.
  • Библиотеки могут создавать свои собственные потоки, и у меня нет возможности принудительно применить обработчики необработанных исключений для этих потоков.

Один из возможных сценариев, которые я вижу, это манипулирование байт-кодом (, например. добавление какого-либо аспекта поверхOutOfMemoryError), однако я не уверен, что это правильный подход или вообще это выполнимо.

Мы включили -XX:+HeapDumpOnOutOfMemoryError, но я не вижу в этом решения этой проблемы, поскольку он был разработан для чего-то другого -и не обеспечивает обратного вызова Java, когда это происходит.

Кто-нибудь сделал это? Как бы вы ее решили или предложили решить? Любые идеи приветствуются.

14
задан mindas 16 July 2012 в 16:13
поделиться