Das Java-Programm wird unerwartet ohne Fehlermeldung beendet

8

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.

    
Fahim 03.02.2010, 05:52
quelle

5 Antworten

4

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:

%Vor%

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

  • durch Ausführen von einem Debugger mit an Schlüsselpunkten festgelegten Haltepunkten oder
  • durch Hinzufügen von Trace-Print-Anweisungen an wichtigen Punkten.
Stephen C 03.02.2010, 06:10
quelle
3

Es scheint, als ob Sie OutofmemoryError bekommen.

Wenn dies der Fall ist, versuchen Sie, die Speichergröße des Heapspeichers zu erhöhen.

%Vor%     
Upul Bandara 03.02.2010 06:05
quelle
2

Ö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.

    
Andy White 03.02.2010 05:56
quelle
1

Ü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.

    
Vinodh Ramasubramanian 03.02.2010 05:57
quelle
0

Es gibt hauptsächlich zwei Gründe.

  1. Ein "unbehandelter" Systemfehler ist aufgetreten, d. h. java.lang.OutOfMemoryError.
  2. Ein "unbehandelter" Anwendungsfehler ist aufgetreten.
  3. System.exit wurde aufgerufen.

Um mit diesen Szenarien umzugehen, sollten Sie die folgenden Schritte ausführen:

  • Suchen Sie in Code für Aufrufe von System.exit.
  • 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"));

  • Beginnen Sie mit args als: -Xloggc: gc.log -XX: + PrintGCDetails -XX: + PrintGCTimeStamps
Robert Höglund 07.02.2017 11:57
quelle

Tags und Links