У нас есть приложение, которое запускает новые JVM и выполняет код от имени наших пользователей. Иногда у них заканчивается память, и в этом случае ведут себя по-разному. Иногда они бросают OutOfMemoryError, иногда они замирают. Я могу обнаружить последнее очень легким фоновым потоком, который перестает посылать сигналы пульса при низкой загрузке памяти. В этом случае мы убиваем JVM, но мы никогда не можем быть абсолютно уверены в том, какова реальная причина отказа от сердечного приступа. (Это может быть проблема сети или ошибка сегментации.)
Каков наилучший способ надежного обнаружения из памяти условий в JVM?
-
В теории опция -XX: OnOutOfMemoryError выглядит многообещающе, но из-за этой ошибки она эффективно непригодна: https://bugs.openjdk.java.net/browse/JDK-8027434
-
Захват OutOfMemoryError на самом деле не является хорошей альтернативой по известным причинам (например, вы никогда не знаете, где это происходит), хотя он работает во многих случаях.
-
Остаются случаи, когда JVM зависает и не бросает OutOfMemoryError. Я все еще уверен, что причиной этой проблемы является память.
Есть ли альтернативы или обходные пути? Настройки сбора мусора, чтобы заставить JVM прекратить работу, а не замораживать?
EDIT: я полностью контролирую как forking, так и раздвоенную JVM, а также код, выполняемый внутри них, оба работают в Linux, и это нормально использовать специальные утилиты ОС, если это помогает.