Antwort
 
Themen-Optionen Thema durchsuchen
Alt 21.04.2005, 16:14 Nach oben    #1
Benutzer
 
Benutzerbild von ehli75
 
Registriert seit: 30.11.2004
Beiträge: 97
Standard Error abfangen

Ich habe gerade das Problem, dass ich massenhaft Daten aus einer DB in den Speicher schaufel ... und dann kommt irgenwann die Meldung:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space.

Kann man diesen Error abfangen (wie z.B. eine Exception) und verarbeiten ?? Ich hab zwar einen try/catch-Block drum ... aber da gehts immer nur rein, wenn eine Exception kommt ...

Michael
ehli75 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 16:28 Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von peschmae
 
Registriert seit: 29.05.2004
Beiträge: 228
Standard

Nicht die Frage, aber du weisst schon dass du mit -Xmx256m oder so den Heap-Limit der JVM raufstellen kannst?

MfG Peschmä
__________________
Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM
"We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth
peschmae ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 16:36 Nach oben    #3
Benutzer
 
Benutzerbild von ehli75
 
Registriert seit: 30.11.2004
Beiträge: 97
Standard

hab ich schon auf 512M gesetzt ...
ehli75 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 16:37 Nach oben    #4
Sym
Chefkoch-Mod
 
Benutzerbild von Sym
 
Registriert seit: 30.05.2004
Beiträge: 433
Standard

Wieviel Daten ziehst Du denn aus der DB?
__________________
Denk mal darüber nach...

Lars

ACHTUNG: wenn ich von Klassen spreche, könnte ich auch deren Instanzen meinen.
www.linuxforen.de +++ www.macuser.de +++ www.mrunix.de +++ www.lmprojects.de
Sym ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 16:49 Nach oben    #5
Erfahrener Benutzer
 
Registriert seit: 16.11.2005
Beiträge: 242
Standard

würd mich auch mal interessieren wieviel daten du da schaufelst ...

oder hast du etwa sowas wie ne recursive SQL Schleife gebaut die dir den Speicher zumüllt?!
nove ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 16:57 Nach oben    #6
Benutzer
 
Benutzerbild von ehli75
 
Registriert seit: 30.11.2004
Beiträge: 97
Standard

Die Menge der Daten ist schon korrekt ... es handelt sich da um eine Zahl zwischen 100.000 und 1.000.000 Objekte, die ich aus den Daten der DB erzeuge.
Das mache ich deshalb, weil ich hinterher sehr viele Berechnungen machen muss, die normaler Weise ständig auf die DB zugreifen. Dadurch das ich vorher das in den Speicher lade, was ich brauche, steigere ich die Performance um ein Zigfaches (Berechnung vorher: über 8 Stunden ... nachher: 3 Min.) Bis jetzt hatte ich immer Berechnungen durchzuführen, wo bis 200.00 Datensaetzen geladen wurden ... aber nun kommen neue Anforderungen ... ;o(

Um nochmal zur Ursprungsfrage zurückzukehren ... kann man einen Error fangen, ohne das mir die VM alles automatisch abwürgt ?
Ich bin auch für andere Anregungen offen ... vielleicht gibts ja noch weiter Speicherschrauben an denen ich drehen könnte ... ?!?!?
ehli75 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 18:59 Nach oben    #7
Erfahrener Benutzer
 
Benutzerbild von peschmae
 
Registriert seit: 29.05.2004
Beiträge: 228
Standard

Um noch auf dein Ursprungsposting zurückzukommen:

Zitat:
Zitat von ehli75
Kann man diesen Error abfangen (wie z.B. eine Exception) und verarbeiten ?? Ich hab zwar einen try/catch-Block drum ... aber da gehts immer nur rein, wenn eine Exception kommt ...
Das ist mir nicht ganz klar. Das ist doch genau das was du willst, oder? Oder ist das Problem dass du dann nichts mehr machen kannst weils halt *überhaupt* keinen Speicher mehr übrig hat, d.h. du möchtest die Exception quasi 5 MB vor Speicherende und nicht erst am Schluss?

Hab noch gerade was gefunden was dich eventuell interssieren könnte: http://www.javaworld.com/javaworld/j...avatip130.html

MfG Peschmä
__________________
Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM
"We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth
peschmae ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.04.2005, 22:02 Nach oben    #8
Neuer Benutzer
 
Benutzerbild von dyrathror
 
Registriert seit: 17.03.2005
Beiträge: 18
Standard

Hi,
je nachdem wie Dein Programm aussieht hilft es vielleicht die Stacksize für Threads hoch zu setzen (-Xss).


Aber ehrlich gesagt würde ich erst einmal kontrollieren ob beim Import Deiner
Daten alles richtig läuft, z.B. nichts mehrfach gespeichert wird, ...
Vielleicht kannst Du Deine Daten auch anders organisieren oder komprimieren?
Wie groß ist denn ein durchschnittlicher Datensatz? Sollten denn alle Daten
rein rechnerisch in Deinen Hauptspeicher passen? Vielleicht kannst Du auch
zwischendurch mal den GarbageCollector starten ?!? Vielleicht hältst Du
noch Referenzen auf Datenstrukturen von denen Du eigentlich dachtest das
sie wieder freigegeben worden sind?

Viel Spaß
Stephan
dyrathror ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2005, 09:54 Nach oben    #9
Benutzer
 
Benutzerbild von ehli75
 
Registriert seit: 30.11.2004
Beiträge: 97
Standard

@peschmae:
Leider ist das nicht so einfach ... wenn eine Anweisung eine Exception wirft, kann ich diese mit einem try-catch-Block fangen. Wenn ein Error (nicht zu verwechseln mit einer Exception) auftritt, wird die ganze Applikation beendet. Meine Frage war, ob man Errors wie eine Exceptions behandeln kann.
Danke für den Link ... werd ich bei Gelegenheit mal ausprobieren!

@dyrathror:
Mehrfach wird nix gespeichert, alte nicht mehr verwendete Referenzen gibt es (leider) nicht ( der Error kommt recht schnell nach dem Programmstart ... also quasi noch beim Reinladen der Daten ).
Das mit dem Umorganisieren der Datenstruktur ist mir auch schon in den Sinn gekommen ... aber das heisst VIEL Arbeit .... ;(

Einen kleinen Ausweg gibts mittlerweile schon ... auf unserem Server, auf dem die Applikation später laufen soll, wurde auf 4GB RAM aufgestockt (aber nicht nur wegen meinem Problem ... ) ... da läufts jetzt. find ich als Entwickler allerdings nicht so toll, da ich die Test lieber lokal durchführe und nicht auf einer produktiven Maschine.

Aber die Frage, ob man einen ERROR abfangen und bearbeiten kann steht aber immer noch ... schliesslich gibt es ja auch noch andere ERRORS (also welche die nix mit dem Speicher zu tun habe) ... und die würde ich auch gerne fangen ... und wenn nur dazu dient, im Programm aufzuräumen (DB-Verbindung ordnungsgemäß beenden, Dateien schließen, ...), dem User eine aussagekräftige Fehlermeldung geben, den Fehler im Log-File "sichern" und dann das Programm zu beenden .

Michael
ehli75 ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.04.2005, 20:21 Nach oben    #10
Erfahrener Benutzer
 
Benutzerbild von peschmae
 
Registriert seit: 29.05.2004
Beiträge: 228
Standard

Zitat:
Zitat von ehli75
@peschmae:
Leider ist das nicht so einfach ... wenn eine Anweisung eine Exception wirft, kann ich diese mit einem try-catch-Block fangen. Wenn ein Error (nicht zu verwechseln mit einer Exception) auftritt, wird die ganze Applikation beendet. Meine Frage war, ob man Errors wie eine Exceptions behandeln kann.
Danke für den Link ... werd ich bei Gelegenheit mal ausprobieren!
Achso, jetzt hab ichs kapiert. Das ist eigentlich eine Assertion. Oder zumindest etwas was anders heisst aber dasselbe ist.

Ich wüsste nicht dass man da was machen kann. Sorry, keine hilfe

MfG Peschmä
__________________
Amazon.de | The Java Trap | Freie Software | Freie Software vs. Open Source | GNU Classpath | GCJ | SableVM
"We should forget about small efficiencies, say about 97% of the time: Premature optimization is the root of all evil." - Donald Knuth
peschmae ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:36 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44