Техника «Хеджирования» для восстановления после ООМ

#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 до тех пор, пока все потоки не будут уничтожены. Вероятно, именно поэтому он и называется хеджированием (от «ставки на хеджирование»): он снижает риск, но не устраняет его.