Was machst du, wenn malloc
0 oder eine neue Ausnahme ausgelöst wird? Einfach anhalten oder versuchen, den OOM-Zustand zu überleben / die Arbeit des Benutzers zu retten?
Was machst du, wenn malloc
0 oder eine neue Ausnahme ausgelöst wird? Einfach anhalten oder versuchen, den OOM-Zustand zu überleben / die Arbeit des Benutzers zu retten?
Antworten:
Ich würde die OOM vermeiden, wie einen Absturz zu vermeiden.
Vermeiden Sie es, einen großen Teil der Arbeit gleichzeitig zu erledigen (und einen großen Teil des Speichers zuzuweisen). Behalten Sie die Daten auf der Festplatte, vertrauen Sie dem Festplatten-Cache des Betriebssystems und verwenden Sie so viel wie möglich speicherabgebildete E / A-Vorgänge. Bearbeiten Sie jeweils nur einen kleinen Teil der Daten. Wenn große Datenmengen online sein müssen (mit geringer Latenz), speichern Sie sie auf mehreren Computern im Speicher, wie dies bei allen großen Suchmaschinenunternehmen der Fall ist. Oder kaufen Sie eine SSD.
Die meisten Leute, die diese Frage beantworten, haben wahrscheinlich noch nie an eingebetteten Systemen gearbeitet, bei denen malloc die Rückgabe von 0 eine sehr reale Möglichkeit ist. Auf einem System, an dem ich gerade arbeite, gibt es insgesamt 4,25 KB RAM (das sind 4352 Byte). Ich ordne 64 Bytes für den Stack zu und habe derzeit einen 1600-Byte-Heap. Erst gestern habe ich eine Heap-Walk-Routine getestet, damit ich die Zuweisung und Speicherfreigabe verfolgen kann. Der Heap-Walk verwendet einen kleinen (30 Byte) statisch zugewiesenen Puffer für die Ausgabe an eine serielle Schnittstelle. Es wird für die Release-Version deaktiviert.
Da es sich um ein Verbraucherprodukt handelt, sollte nach der Veröffentlichung des Produkts nicht der Speicher ausgehen. Ich bin mir sicher, dass dies während der Entwicklung der Fall sein wird. In jedem Fall kann ich den Lautsprecher nur ein paar Mal piepen und einen Neustart erzwingen.
Um ehrlich zu sein, habe ich bei allen Projekten, die ich durchgeführt habe (denken Sie daran, dass ich noch nirgendwo arbeite), nie daran gedacht, dass dies passieren könnte, und daher würde mein Programm wahrscheinlich sehr schnell sterben.
Außerdem müssen Sie für die Bearbeitung eines OOM die Ressourcen vorab zugewiesen haben, um die Fehlermeldung anzuzeigen oder alles zu speichern, was unpraktisch sein kann.
Ich habe das Gefühl, dass heutzutage Speicher, der weniger kostet als Erdnüsse, nicht häufig vorkommen sollte. Zu Beginn des geschützten Gedächtnisses und früher war das vielleicht ein Problem, aber jetzt? Die einzigen OOM-Fehler, die ich jemals gesehen habe, waren fehlerhafter Code.
Das Überprüfen der Malloc-Rückkehrcodes ist normalerweise sowieso sinnlos.
Moderne Betriebssysteme überbeanspruchen Speicher: Sie geben Prozessen mehr Speicher als tatsächlich verfügbar ist. Der Speicher, den Ihr Prozess erhält, ist virtuell und alle einer einzelnen Seite mit Nullen zugeordnet.
Erst wenn Sie in den Speicher schreiben, wird Ihren Prozessen eine physische, eindeutige Seite zugewiesen. Wenn diese Zuordnung fehlschlägt, beendet der Kernel einen Prozess (möglicherweise Ihren!), Um Speicher zu finden. Zu diesem Zeitpunkt können Sie nichts mehr tun.
Es sei denn, Sie entwickeln für eingebettete Systeme, Echtzeitsysteme oder Systeme, die so kritisch sind, dass Ausfälle Leben oder Milliarden von Dollar kosten können ... Dann lohnt es sich wahrscheinlich finanziell nicht, sich über Speicherprobleme Gedanken zu machen.
In den meisten Fällen kann ohnehin wenig getan werden, wenn Sie nicht genügend Speicher haben, da kein Speicher vorhanden ist, um neue Objekte zu erstellen oder Aufgaben auszuführen, die möglicherweise etwas bewirken. Sie müssen die Kosten für die App-Handhabung von OOM gegen den Nutzen abwägen, den Sie daraus ziehen.
Ich würde immer nach Fehlern suchen. Wenn etwas eine Fehlerbedingung zurückgibt, muss dies von Ihrem Programm behandelt werden. Selbst wenn es sich um eine Nachricht handelt, die besagt: "Nicht genügend Speicher, muss gehen!", Ist sie besser als "Zugriffsverletzung", "Core Dumped" oder was auch immer. Eine ist eine Fehlerbedingung, die Sie behandeln, die andere ist ein Fehler. Und der Benutzer wird es auch als solches wahrnehmen.
In Ihrem speziellen Fall können Sie versuchen, den Vorgang zurückzusetzen, die von Ihnen zugewiesenen Ressourcen freizugeben, bis der Fehlerpunkt erreicht ist, den Fehler zu melden und die Ausführung fortzusetzen (möglicherweise können Sie beim Beenden der Anwendung die angeben Option zum sofortigen Beenden). Auf diese Weise kann der Benutzer entscheiden, was zu tun ist, oder versuchen, Speicherplatz freizugeben, indem er herumfummelt, Dateien schließt usw. Natürlich hängt es stark von Ihrem Programm ab, wie Sie mit der Situation umgehen können - ein Programm, das dies nicht tun soll interaktiv sein muss wahrscheinlich nur den Fehler protokollieren und entweder beenden oder fortfahren.