Ich habe ein Java-Programm geschrieben, das Tausende von Textdateien verarbeiten muss (alle müssen in den Speicher geladen werden). Es funktioniert gut mit bis zu 123 Eingabedateien, aber wenn ich es für die Verarbeitung von etwa 5000 Dateien ausführen, wird es unerwartet in der Mitte der Straße beendet, ohne irgendeine Fehlermeldung / Ausnahme zu geben. Kann mir jemand Hinweise geben, was schief gegangen ist?
Ich verwende jdk1.6 auf Mac OS Leopard mit 2 GB RAM.
Da es sich um Ihr Programm handelt, schlage ich Folgendes vor:
Ändern Sie zunächst die Methode main
, so dass alles in einem try / catch-Block ausgeführt wird, der alle nicht abgefangenen Ausnahmen meldet; z.B. etwas wie das:
Zweitens, suchen Sie nach einer Stelle, an der Sie unerwartete Ausnahmen "zerquetschen" könnten, indem Sie sie abfangen und nicht melden.
Suchen Sie drittens nach einer Stelle, die Sie ruhig System.exit()
nennen könnten. Dies könnte auch in Bibliotheken passieren ... wenn Sie eine schlecht geschriebene verwenden.
Wenn diese Maßnahmen keine Antworten liefern, versuchen Sie herauszufinden, WIE die Anwendung beendet wird
Es scheint, als ob Sie OutofmemoryError
bekommen.
Wenn dies der Fall ist, versuchen Sie, die Speichergröße des Heapspeichers zu erhöhen.
%Vor%Öffnen Sie Dateien gleichzeitig? Möglicherweise haben Sie nicht genügend Arbeitsspeicher, wenn Sie zu viele Dateien gleichzeitig laden. Wenn die Dateien groß genug sind, wird möglicherweise nicht mehr genügend Arbeitsspeicher mit nur einer einzigen Datei geöffnet. Stellen Sie außerdem sicher, dass Sie die Dateien schließen, wenn Sie damit fertig sind.
Überprüfen Sie, ob Sie try / catch-Blöcke haben, die Ausnahmen nicht ordnungsgemäß protokollieren.
Es könnte höchstwahrscheinlich OutofmemoryError sein. Stellen Sie sicher, dass die Konsole nicht umgeleitet wird.
Es gibt hauptsächlich zwei Gründe.
Um mit diesen Szenarien umzugehen, sollten Sie die folgenden Schritte ausführen:
Stellen Sie sicher, dass Sie alle Ausnahmen im startenden Java-Stack-Frame behandeln, d. h. Main-Methode:
versuchen { ..Code } catch (Throwable t) { t.printStackTrace }
Stellen Sie sicher, dass Sie steuern können, wohin stdout und stderr geleitet werden. Sie können diese programmatisch auf konkrete Dateien setzen:
System.setOut (neuer PrintStream ("output.txt")); System.setErr (neuer PrintStream ("err.txt"));