Я хотел бы предоставить моей системе способ обнаружить, произошло ли исключение из памяти или нет. Цель этого упражнения состоит в том, чтобы выставить этот флаг через JMX и действовать соответствующим образом (например, путем настройки соответствующего предупреждения в системе мониторинга), поскольку в противном случае эти ошибки остаются незаметными в течение нескольких дней.
Наивный подход для этого заключался в том, чтобы установить неперехваченный обработчик исключений для каждого потока и проверить, является ли возбужденное исключение экземпляром OutOfMemoryError
и установить соответствующий флаг. Однако этот подход нереалистичен по следующим причинам:
- Исключение может происходить где угодно, включая сторонние библиотеки. Я ничего не могу сделать, чтобы они не ловили
Throwable
и сохраняли это для себя. - Библиотеки могут создавать свои собственные потоки, и у меня нет способа принудительного выполнения обработчиков исключений для этих потоков.
Один из возможных сценариев, которые я вижу, - это манипуляция байт-кодом (например, прикрепление какого-то аспекта поверх OutOfMemoryError
), однако я не уверен, что этот правильный подход или это вообще возможно.
У нас включен -XX:+HeapDumpOnOutOfMemoryError
, но я не рассматриваю это как решение этой проблемы, поскольку он был разработан для чего-то другого - и при этом он не выполняет обратного вызова Java, когда это происходит.
Кто-нибудь это сделал? Как бы вы решили его или предложили его решить? Любые идеи приветствуются.