PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehler wie finden und beheben?



mwanaheri
26-05-2006, 16:59
Ich habe hier bei einer Datenbankanwendung ein merkwürdiges Verhalten:
Sie läuft normalerweise problemlos. Nun muss ich jedoch einige Sachen an einer Kopie der Datenbank machen. Ändere ich die Datenbankverbindung auf die Kopie, so erhalte ich folgende Fehlermeldung:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

Mehr Informationen krieg ich nicht. Beim Durchlauf im Debugger zeigt sich, dass die Verbindung zur Datenbank korrekt aufgebaut wird. Später im Programmstart jedoch bricht das Programm mit o.g. Fehlermeldung ab. Zu dem Zeitpunkt ist es in den Systemklassen, so dass ich nicht recht weiß, wie ich herausfinden kann, wo der Fehler im Programm liegt.

Hat jemand eine Idee dazu?

bischi
26-05-2006, 17:11
Die Fehlermeldung scheint recht eindeutig: Zu wenig Speicherplatz vorhanden!

Beheben: Irgendwo kannst du bei Java glaub einstellen, wie viel Speicher ein Programm verwenden darf. Frag mich jetzt aber nicht wo...

Mfg Bischi

mwanaheri
26-05-2006, 17:15
Danke schon mal für die Antwort. Was ich nicht verstehe: Wenn die beiden Datenbanken identisch sind, wieso braucht er dann bei der einen erheblich mehr Speicher als bei der anderen?

bischi
26-05-2006, 17:21
Kann es sein, dass du beide gleichzeitig lädst und somit die vorherige noch im Speicher hast?

MfG Bischi

mwanaheri
26-05-2006, 17:28
Hm, die Anwendung hat nur eine Datenbankverbindung (wird durchgereicht), und die habe ich geändert. Es kann also eigentlich keine andere offen sein. Vorsichtshalber habe ich auch Eclipse beendet und gecheckt, dass keine Java-instanz offen ist. Bringt auch nix.

*kopfkratz*

Das Problem besteht auch dann, wenn sich die jvm 512 - 700 Mb schnappen darf. Das müsste für eine vielfache Programmausführung reichen.
I gehe das Ganze noch mal Klasse für Klasse durch, nach Aufrufhierarchie.

mwanaheri
26-05-2006, 21:11
Autsch! Fehler gefunden. Saublöder Fehler. Ich hatte beim Vorbefüllen einer Liste vergessen, ein Limit zu setzen. So wäre der Fehler auch auf der normalen Datenbank aufgetreten.

Zum Fehlereinkreisen habe ich von der Hauptklasse aus alle jeweils aufgerufenen Konstruktoren mit System.out.println() umgeben und bin dann jeweils in die Klassen abgestiegen (Reihenfolge nach Aufruf), innerhalb derer es geknallt hat. Ist nicht schön, funktioniert aber. Kennst du da ein effizienteres Verfahren, wenn man keine ordentliche Fehlermeldung kriegt?

nul
27-05-2006, 13:46
Verwende log4j in deinem Projekt, dann kannst du die Meldungen auch im endgueltigen Programm lassen und setzt nur den Output-Level.
http://logging.apache.org/log4j/docs/http://logging.apache.org/log4j/docs/

mwanaheri
27-05-2006, 15:17
danke für den Tipp. Werde da mal stöbern gehen.