Frage

Was machst du wenn malloc Gibt 0 oder neue Ausnahme aus? Halten Sie einfach an oder versuchen Sie, die Bedingung zu überleben/die Arbeit des Benutzers zu speichern?

War es hilfreich?

Lösung

Ich würde das OOM vermeiden, einen Absturz zu vermeiden.

Vermeiden Sie es, einen großen Teil der Arbeit zu erledigen (und zuteilieren einen großen Teil des Gedächtnisses) sofort. Bewahren Sie die Daten auf der Festplatte auf, vertrauen Sie dem OS-Festplatten-Cache und nutzen Sie den Speicher-Kartelled IO so weit wie möglich und arbeiten Sie jeweils nur mit einem kleinen Teil der Daten. Wenn große Datenmengen online sein müssen (serviert mit geringer Latenz), halten Sie sie im Speicher über mehrere Maschinen hinweg, wie alle großen Suchmaschinenunternehmen. Oder kaufen Sie eine SSD.

Andere Tipps

Die meisten Leute, die diese Frage beantworten, haben wahrscheinlich nie an eingebetteten Systemen gearbeitet, bei denen Malloc -Rückkehr 0 eine sehr reale Möglichkeit ist. In einem System, an dem ich gerade arbeite, gibt es insgesamt 4,25.000 Bytes RAM (das sind 4352 Bytes). Ich habe 64 Bytes für den Stapel zugewiesen und habe derzeit einen 1600 Byte -Haufen. Erst gestern habe ich eine Heap -Walk -Routine debuggen, damit ich der Zuteilung und Befreiung des Gedächtnisses folgen kann. Der Heap Walk verwendet einen kleinen (30 Byte) zugewiesenen Puffer für einen seriellen Anschluss. Es wird für die Release -Version ausgeschaltet.

Da es sich um ein Konsumgüterprodukt handelt, ist es nach Veröffentlichung des Produkts besser nicht mehr das Gedächtnis. Ich bin sicher, dass es während der Entwicklung wird. In jedem Fall kann ich nur ein paar Mal den Sprecher beschlagen und einen Neustart erzwingen.

Um ziemlich ehrlich zu sein, in allen Projekten, die ich durchgeführt habe (denken Sie daran, dass ich noch nirgendwo arbeite), habe ich nie darüber nachgedacht, dass dies passieren könnte, und daher würde meine Programme ein sehr schnelles Tod sterben.

Außerdem müssen Sie mit einem OOM die Ressourcen vorbereiten, um die Fehlermeldung anzuzeigen oder alles zu speichern, was irgendwie unpraktisch sein kann.

Ich habe das Gefühl, dass in diesen Tagen das Gedächtnis, das weniger als Erdnüsse kostet, nicht häufig passieren sollte. Im Morgengrauen des geschützten Gedächtnisses und zuvor war das vielleicht ein Problem, aber jetzt? Die einzigen OOM -Fehler, die ich je gesehen habe, stammten aus fehlerhaftem Code.

Das Überprüfen von Malloc -Rückgaberückern ist sowieso sinnlos.

Moderne Betriebssysteme Überbeamte Speicher: Sie geben Prozesse mehr Speicher als tatsächlich verfügbar. Der Speicher, den Ihr Prozess gewährt wird, ist virtuell und auf eine einzelne Null-Out-Seite zugeordnet.

Erst wenn Sie in das Gedächtnis schreiben, wird eine physische, eindeutige Seite für Ihre Prozesse zugewiesen. Wenn diese Zuordnung nicht bestand, beendet der Kernel einen Prozess (vielleicht Ihre!), Um Speicher zu finden. Zu diesem Zeitpunkt gibt es nichts mehr.

Wenn Sie sich nicht für eingebettete Systeme, Echtzeitsysteme oder Systeme entwickeln, die so wichtig sind, dass Fehler Leben oder Milliarden Dollar kosten können ... dann lohnt es sich wahrscheinlich nicht, sich um die Bedingungen des Gedächtnisses zu kümmern.

In den meisten Fällen gibt es wenig, wenn Sie sowieso nicht in Erinnerung sind, da es keinen Speicher gibt, 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 im Vergleich zu dem Vorteil abwägen, den Sie davon erhalten.

Ich würde immer auf Fehler suchen. Wenn etwas eine Fehlerbedingung zurückgibt, muss es von Ihrem Programm behandelt werden. Auch wenn es sich um eine Nachricht handelt, in der "aus dem Gedächtnis, muss man gehen!", Ist es besser als "Zugriffsverletzung", "Core Dumped" oder was auch immer. Einer ist eine Fehlerbedingung, die Sie behandeln, der andere ist ein Fehler. Und der Benutzer wird es als solche wahrnehmen.

Für Ihren spezifischen Fall können Sie versuchen, den Vorgang zurückzusetzen, die von Ihnen zugewiesenen Ressourcen zu befreien, bis Sie den Fehlerpunkt erreicht haben, den Fehler melden und die Ausführung fortsetzen (möglicherweise, wenn Sie versuchen, die Bewerbung zu beenden, können Sie das geben Option sofort zum Beenden). Auf diese Weise kann der Benutzer entscheiden, was zu tun ist, oder versuchen, einen Speicher zu freien Seien Sie interaktiv, muss wahrscheinlich nur den Fehler protokollieren und entweder beenden oder fortfahren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
scroll top