Да, OOM подлежит восстановлению. В качестве крайнего примера, операционные системы Unix и Windows довольно хорошо восстанавливаются в условиях OOM, в большинстве случаев. Приложения перестают работать, но ОС выживает (при условии, что памяти достаточно для правильной загрузки ОС).
Я привожу только этот пример, чтобы показать, что это можно сделать.
Проблема работы с OOM действительно зависит от вашей программы и среды.
Например, во многих случаях место, где происходит OOM, скорее всего, НЕ лучшее место для реального восстановления после состояния OOM.
Теперь пользовательский распределитель может работать как центральная точка в коде, который может обрабатывать OOM. Распределитель Java выполнит полный сборщик мусора до того, как он фактически выдаст исключение OOM.
Чем более «известно приложению» о вашем распределителе, тем лучше он будет использоваться в качестве центрального обработчика и агента восстановления для OOM. Снова используя Java, его распределитель не особенно осведомлен о приложении.
Это то, где что-то вроде Java легко разочаровывает. Вы не можете переопределить распределитель. Таким образом, хотя вы можете перехватывать исключения OOM в своем собственном коде, ничто не говорит о том, что какая-то используемая вами библиотека правильно перехватывает или даже правильно перебрасывает исключение OOM. Создать класс, который навсегда разрушен исключением OOM, тривиально, поскольку для некоторого объекта задано значение NULL и «этого никогда не случится», и его невозможно восстановить.
Итак, да, OOM можно восстановить, но это может быть ОЧЕНЬ сложно, особенно в современных средах, таких как Java, и изобилие сторонних библиотек различного качества.