Если какой-то фрагмент кода в JVM вашего приложения решит, что он хочет попытаться перехватить OOME и попытаться восстановить его, вы (к сожалению) ничего не сможете сделать, чтобы остановить его ... кроме героев AOP, которые, вероятно,непрактично и, безусловно, отрицательно сказывается на производительности и ремонтопригодности вашего приложения.Кроме того, лучшее, что вы можете сделать, это отключить JVM с помощью хука OnOutOfMemoryError.Смотрите ответ выше: https://stackoverflow.com/a/3878199/139985/
По сути, вы должны доверять другим разработчикам, чтобы они не делали глупостей.Другие глупые вещи, от которых вы, вероятно, не должны пытаться защищаться, включают:
- вызов
System.exit()
в глубине библиотечного метода, - вызов
Thread.stop()
и друзей, - утечка открытых потоков, соединения с базой данных и т. Д.,
- порождение большого количества потоков,
- случайное сжатие (т.е. перехват и игнорирование), исключение
- и т. Д.
На практике, для выявления подобных проблем в коде, написанном другими людьми, нужно использовать средства проверки качества кода и выполнять проверки кода.
Если проблема связана со сторонним поставщикомкод, сообщите об этом как ОШИБКА (что, вероятно, есть), и, если они не согласны, начните искать альтернативы.
Для тех, кто этого еще не знает, есть ряд причин, почемуЭто плохая идея, чтобы попытаться восстановиться после OOME:
Возможно, OOME было выброшено, когда текущий поток находился в процессе обновления какой-то важной структуры данных.В общем случае код, который перехватывает этот OOME, не может этого знать, и если он пытается «восстановить», существует риск, что приложение продолжит работу с поврежденной структурой данных.
Если приложение является многопоточным, существует вероятность того, что OOME могли бы быть брошены и в другие потоки, что затрудняет восстановление.
Даже если приложение может восстановиться безоставляя структуры данных в несогласованном состоянии, восстановление может привести к тому, что приложение будет зависать еще несколько секунд, а затем снова OOME.
Если вы не установите соответствующие параметры JVM, JVMэто почти исчерпало память имеет тенденцию тратить много времени на сбор мусора в тщетной попытке продолжать делать.Попытка восстановления из OOMEs, вероятно, продлит агонию.
Восстановление из OOME ничего не делает для устранения основной причины, которая обычно является утечкой памяти, плохо спроектированной (то есть расточительной памяти)) структура данных и / или запуск приложения с кучей, которая слишком мала.