Fang OutOfMemoryError
Gibt es einen Punkt, fangen eine out-of-memory-Fehler (java.lang.OutOfMemoryError
) in Java?
InformationsquelleAutor Viren Pushpanayagam | 2011-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es einen Punkt, fangen eine out-of-memory-Fehler (java.lang.OutOfMemoryError
) in Java?
InformationsquelleAutor Viren Pushpanayagam | 2011-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Hier sind ein paar Beispiele, wo es sinnvoll ist:
Jedoch, beachten Sie, dass normalerweise (es sei denn, Sie sind an einer Stelle, wo Sie die Zuweisung Tonnen von Speicher auf einmal), würden Sie wahrscheinlich nicht gezielt fangen OutOfMemoryError für diese Fälle, aber lieber ein
catch Throwable
alle die Möglichkeit an der Spitze in Ihrem Haupt-Einstiegspunkt.aber wie wollen Sie einen Fehler melden mit einem finally-block?
Das ist keine gute Idee, da der finally-block wird nur Ergebnis in die Ausfahrt ein thread, für Sie, um ein ordnungsgemäßes Herunterfahren, können Sie brauchen, um Ihre Arbeit zu speichern und exit() das Programm.
InformationsquelleAutor Epaga
Die goldene Regel ist, nur fangen Fehler, die Sie behandeln können. Wenn Sie etwas nützliches tun können, nachdem ein OutOfMemory-Fehler, dann gehen Sie vor.
InformationsquelleAutor Ingo
Nein, fangen
Exception
undRuntimeException
, aber kaum je (geändert von 'nie')Error
:Hinweis:
Ich zitiere die offizielle Javadocs hier. Wenn Sie damit nicht einverstanden sind, sagen, Orakel, don ' T shoot the messenger 🙂
Es ist bevorzugt zum abfangen von Fehlern in Entwicklung/Test und mit Ihnen umzugehen. Für den Arbeitsspeicher erhöhen, Arbeitsspeicher für die VM, aber natürlich werden Sie manchmal müssen restrukturieren, um Ihre Anwendung zu verwenden, die weniger Speicher irgendwann.
widersprechen aus Prinzip mit "Nie". 🙂
fair genug, geändert,
"sollten Sie nicht versuchen, Sie zu fangen" und "nicht fangen" sind 2 völlig unterschiedliche Dinge.
InformationsquelleAutor Sean Patrick Floyd
Als einige andere Antworten haben darauf hingewiesen, es ist ein schlechte Idee zu fangen
OutOfMemoryError
wiederherstellen und versuchen,1. Anstatt nur zu wiederholen, dass die javadoc sagt SieError
Ausnahmen sind nicht wiederherstellbar, ich werde versuchen zu erklären, warum.In der Tat gibt es mindestens zwei handfeste Gründe, warum OOME recovery ist unklug:
Der Erste Grund ist, dass OOME sind in der Regel das Ergebnis der nicht diagnostizierten Speicher-Lecks. Wenn Ihre Anwendung die Fänge und versucht sich zu erholen, sind die Chancen, dass das Speicherleck wird weiterhin erreichbar sein und daher noch nicht freigegeben werden. Also, wenn Ihre Anwendung startet, Dinge zu tun, ist es wahrscheinlich zu lecken, mehr Arbeitsspeicher ... und führen Sie in eine andere OOME. Früher oder später, wird die Anwendung zum Stillstand.
Da es keine Möglichkeit gibt, können Sie absolut sicher sein, dass Ihre Anwendung nicht Leck, OOME recovery wird nie eine Feste, verlässliche Antwort.
Der Zweite Grund ist, dass wenn ein OOME Auftritt, gibt es eine chance, dass es wird nicht Schaden, um den ausführungszustand. Kann es passieren, dass threads beendet, so dass andere threads warten auf Meldungen, die niemals kommen wird, etc. Es könnte auftreten, in der Mitte der Aktualisierung eine kritische Anwendung der Struktur der Daten oder (vielleicht noch schlimmer) eine JVM-Daten-Struktur. Wenn Ihre Anwendung versucht dann, sich zu erholen, könnte es sperren, oder (schlimmer noch) es könnte gelingen, geht zu halten, mit fehlerhaften Daten zu unvorhersehbaren Ergebnissen führen.
Es sei denn, Sie führen eine forensische Analyse der Codebasis, können Sie nie ganz sicher sein, dass diese Art der Sache nicht geschieht.
Ich will nicht sagen, sollten Sie NIEMALS versuchen zu erholen von einer OOME, aber im Allgemeinen ist es eine riskante Sache zu tun. Und je komplexer die Anwendung ist, desto schwieriger ist es, das Risiko zu bewerten.
1 - Hier bin ich im Gespräch über den Fang OOME in einem Versuch, damit die Anwendung weiter ausgeführt wird, wie zuvor; D. H. zur Wiederherstellung der Anwendung. Fang ein OOME, um zu erfüllen (oder trigger) ein geordneter shutdown -, ist eine andere Frage.
InformationsquelleAutor Stephen C
Wenn Sie wollen, um ein ordnungsgemäßes Herunterfahren, die Griffe diesem Fall spezifisch.
Können Sie es auch verwenden, wenn Sie haben können, reservieren Sie eine große Auswahl und Sie wollen die anmutig degradieren Ihr system.
EDIT: Ein Beispiel-code, wo ich verwendet, um zu überprüfen, OOM, wenn der stream fehlerhaft war. Ich habe seit dem ersetzen der len überprüfen, um sicherzustellen, die len ist zwischen 0 und 16 MB statt.
Nein wäre es nicht.
Wenn das system stürzt ab mit crash dump-es gibt nichts, was Sie tun können, in Java. Allerdings, wenn alles, was Sie bekommen ist ein Fehler wegen ungenügenden Speicherplatzes, können Sie fangen und lassen Sie Ihr system am laufen zu halten. Es gibt nichts zu diesem Fehler, welche Kräfte Ihr system zum Absturz zu bringen.
Aus Neugier - wenn man ein OOM, was bedeutet, dass es keinen Raum mehr, in den Haufen zu ordnen, um Objekte und der GC ist auch nicht erstellen jeder freie Platz dann wo Ihre Objekte erstellt werden und wie müsste dein Programm laufen?
Wenn Sie versuchen, ein array zu erstellen oder ein Bild oder Textblock, die ist viel zu groß, es werden nicht geradezu (vielleicht gar nicht auslösen GC) Dadurch wird OOM auch, wenn Sie geschehen, haben viele MB frei (weil Sie nicht genug freier Speicher zum erstellen dieses große Objekt) Für ein ordnungsgemäßes Herunterfahren, wenn Sie noch nicht entstanden große Objekte, die Sie erstellen, ein 1 MB byte [], welches Sie klar, nur beim Herunterfahren.
InformationsquelleAutor Peter Lawrey
Dies bereits erwähnt wurde, eine Anzahl von Zeiten, aber die Antworten zeigen ein paar Menschen sind verwirrt, über das (gemeinsame) recovery-Technik für eine
OutOfMemoryError
. Check meinen post zu Was ist, wenn neuer ausfällt? für eine demo, wie es zu tun.InformationsquelleAutor Andrew Thompson
Der einzige Ort, den ich getan habe, war der mobile-Entwicklung. Sie können Fragen Sie den Benutzer auf andere Anwendungen schließen, um Ihre Anwendung Fähigkeit, richtig zu arbeiten. Aber das ist nicht der Fall, der Android-Entwicklung.
Sehe ich keine anderen Dinge, die Sie tun können, mit der situation. Kann sein, einige entsprechende Protokollierung oder zu bereinigen.
InformationsquelleAutor Vladimir Ivanov
Es ist nicht eine Ausnahme; es ist ein Fehler: java.lang.OutOfMemoryError
Können Sie fangen es, wie es steigt von Throwable:
Jedoch, es sei denn, Sie machen einige eher spezielle Sachen (Zuteilung der Tonnen von Dingen, die in einem bestimmten code-Abschnitt, zum Beispiel), die Sie wahrscheinlich nicht in der Lage sein, es zu fangen, da Sie nicht wissen, wohin es geht geworfen werden.
InformationsquelleAutor developer
Dies ist einer der Fehler, sollten Sie nie fangen. Der Grund dafür ist einfach, Sie werden nicht in der Lage, etwas dagegen zu tun zur Laufzeit. Allerdings, wenn Ihre Anwendung wird regelmäßig mit dieser Fehlermeldung dann sollten Sie die folgenden Strategien, um dieses Problem zu verringern-
Wenn der Fehler weiterhin bestehen, dann verwenden Sie einen profiler wie JProfiler oder ein Eclipse MATTE zu analysieren, wie viel Arbeitsspeicher von Ihrer Anwendung verwendet wird.
Bewegen, um eine 64-bit-system und erhöhen Sie die JVM-Speicher noch weiter.
InformationsquelleAutor Pushkar