Ja, OOM ist wiederherstellbar. Ein extremes Beispiel: Die Betriebssysteme Unix und Windows erholen sich in den meisten Fällen recht gut von OOM-Zuständen. Die Anwendungen fallen aus, aber das Betriebssystem überlebt (vorausgesetzt, es ist genügend Speicher vorhanden, damit das Betriebssystem überhaupt ordnungsgemäß starten kann).
Ich führe dieses Beispiel nur an, um zu zeigen, dass es möglich ist.
Das Problem des Umgangs mit OOM ist wirklich abhängig von Ihrem Programm und Ihrer Umgebung.
Zum Beispiel ist in vielen Fällen der Ort, an dem der OOM am wahrscheinlichsten auftritt, NICHT der beste Ort, um sich von einem OOM-Zustand zu erholen.
Nun könnte ein benutzerdefinierter Allokator möglicherweise als zentraler Punkt innerhalb des Codes fungieren, der einen OOM behandeln kann. Der Java-Allokator führt eine vollständige GC durch, bevor er eine OOM-Ausnahme auslöst.
Je "anwendungsbewusster" Ihr Allokator ist, desto besser eignet er sich als zentraler Handler und Recovery Agent für OOM. Wiederum mit Java ist der Allokator nicht besonders anwendungsbewusst.
Das ist der Punkt, an dem etwas wie Java leicht frustrierend ist. Sie können den Allokator nicht überschreiben. Während Sie also OOM-Ausnahmen in Ihrem eigenen Code abfangen können, gibt es keine Garantie dafür, dass eine Bibliothek, die Sie verwenden, eine OOM-Ausnahme richtig abfängt oder sogar richtig auslöst. Es ist trivial, eine Klasse zu erstellen, die durch eine OOM-Ausnahme für immer ruiniert ist, da ein Objekt auf null gesetzt wird und "das nie passiert", und es ist nie wiederherstellbar.
Also, ja, OOM ist wiederherstellbar, aber es kann sehr schwer sein, vor allem in modernen Umgebungen wie Java und es ist eine Fülle von 3rd-Party-Bibliotheken von unterschiedlicher Qualität.