#java #memory #out-of-memory
Вопрос:
Я работаю над сервисом , который отключается всякий раз, когда он ловит OutOfMemoryError
, этот механизм реализуется UncaughtExceptionHandler
следующим образом:
private byte[] hedge = new byte[0x10000];
Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
hedge = null;
log.error(e);
//signals the service to shut down whenever any thread crashes with an OOM
Service.shutdown();
});
Я нашел несколько старых статей о восстановлении OOM, относящихся к началу 2000-х годов, подобных этой, в них объясняется шаблон «хеджирования», когда выделяют массив и разыменовывают его при обнаружении OOM.
Интересно, имеет ли вообще смысл этот шаблон и действительно ли он применяется? В частности, как я могу знать, что пространство разыменованного массива не будет немедленно занято каким-либо другим потоком?
Комментарии:
1. У вас нет никаких гарантий. Возможно, вам повезет и вы сможете успешно завершить работу, или приложение может продолжать генерировать
OutOfMemoryError
до тех пор, пока все потоки не будут уничтожены. Вероятно, именно поэтому он и называется хеджированием (от «ставки на хеджирование»): он снижает риск, но не устраняет его.