Ich arbeite an einem System, das Speicher für den IO-Cache zuweist, um die Leistung zu erhöhen. Wenn es dann OOM feststellt, nimmt es einen Teil davon zurück, damit die Geschäftslogik fortgesetzt werden kann, auch wenn das weniger IO-Cache und eine etwas geringere Schreibleistung bedeutet.
Ich habe auch mit einer eingebetteten Java-Anwendung gearbeitet, die versuchte, OOM zu verwalten, indem sie die Garbage Collection erzwang und optional einige unkritische Objekte freigab, z. B. vorab abgerufene oder zwischengespeicherte Daten.
Die Hauptprobleme bei der OOM-Behandlung sind:
1) die Möglichkeit, den Versuch an der Stelle zu wiederholen, an der der Fehler aufgetreten ist, oder die Möglichkeit, zurückzugehen und den Versuch von einem höheren Punkt aus zu wiederholen. Die meisten modernen Programme verlassen sich zu sehr auf die Sprache, um einen Wurf auszuführen, und verwalten nicht wirklich, wo sie landen und wie sie die Operation erneut versuchen können. In der Regel geht der Kontext der Operation verloren, wenn er nicht dafür ausgelegt ist, erhalten zu bleiben.
2) in der Lage zu sein, tatsächlich etwas Speicher freizugeben. Dies bedeutet eine Art Ressourcenmanager, der weiß, welche Objekte kritisch sind und welche nicht, und dass das System in der Lage ist, die freigegebenen Objekte erneut anzufordern, wenn sie später kritisch werden
Ein weiterer wichtiger Punkt ist die Möglichkeit, ein Rollback durchzuführen, ohne eine weitere OOM-Situation auszulösen. Dies ist etwas, das in höheren Sprachen schwer zu kontrollieren ist.
Außerdem muss sich das zugrunde liegende Betriebssystem in Bezug auf OOM vorhersehbar verhalten. Bei Linux ist dies beispielsweise nicht der Fall, wenn Memory Overcommit aktiviert ist. Viele Swap-fähige Systeme werden eher sterben, als dass sie den OOM an die betreffende Anwendung melden.
Und es gibt den Fall, dass es nicht Ihr Prozess ist, der die Situation verursacht hat, so dass das Freigeben von Speicher nicht hilft, wenn der beleidigende Prozess weiterhin leckt.
Aus diesem Grund sind es oft die großen und eingebetteten Systeme, die diese Techniken anwenden, da sie die Kontrolle über Betriebssystem und Speicher haben, um sie zu ermöglichen, und die Disziplin/Motivation, sie zu implementieren.