ERLEDIGT
NEIN
NEIN
ANTWORTEN
3
3
ZUGRIFFE
690
690
EMPFEHLEN
-
17.03.10 11:25 #1
- Registriert seit
- Jul 2005
- Beiträge
- 59
Hallo,
ich habe einen Engpass in der folgenden Routine: Ich möchte aus einer relationalen Datenbank, die wiefolgt aufgebaut ist, "ein paar" Datensätze in eine Liste speichern.
- Wald
- Baum
- Ast
- Zweig
- Blatt
Dabei hole ich mir ein paar bestimmte Bäume aus dem Wald, die dazugehörigen Äste, Zweige und auch Blätter und speichere diese entsprechend in einer ArrayList<Integer> baeume, aeste etc. Der Integer ist dabei der PRIMARY KEY (der Index) des jeweiligen Datensatzes.
Nun kann es sein, dass ich bis zu 1.000 Bäume aus dem Wald holen muss, die in dem Falle wiederum mindestens 500 Äste haben, die wiederum (...). Also eine ganze Anzahl an Indizes, die gespeichert werden müssen (die Anzahl der Äste ist ~500x1000, die der Zweige ~500x1000x4 usw.).
Nun bin ich einher gegangen und habe einen Profiler (VisualVM) verwendet, um mir die "großen" Objekte anzeigen zu lassen. Dabei ist kurz vor dem heap-space-Volllaufen folgendes Bild entstanden: http://img407.imageshack.us/img407/1049/heap.png
Die Exception lautet wiefolgt
Code :1 2 3
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space at java.util.HashMap.<init>(Unknown Source) at java.util.HashSet.<init>(Unknown Source)
Nun zu meiner eigentlichen Frage: Das Objekt java.util.HashMap$Entry[] ist laut Profiling "bloß" ~4MB groß, der Rest nicht viel größer; wieso läuft mir also der Heap voll?
Ich programmiere nicht allzu viel in Java, also bitte ich um etwas Nachsicht; hoffe aber, dass mir geholfen werden kann. Es gibt selbstverständlich weitere Lösungsansätze zu diesem Thema, partielle Bestimmung der Indizes usw. aber darum geht es mir nicht. Ich versuche eher gerade die Problematik zu verstehen.
LG KK
-
17.03.10 11:39 #2
-XmxZahlDimension
Also z. B. -Xmx128M.
Achte darauf, dass kein Space reinkommt.
Kann sein, dass ich jetzt etwas falsches sage, deshalb bitte nicht darauf verlassen sondern sich an eine bessere Quelle wenden, aber ich glaube dass der Heap Space soetwas ähnliches wie der Stack für Methodenaufrufe für Objekte ist, es geht also nicht um den endgültigen Verbrauch sondern dem ständigen erzeugen.Mein kleiner webstart Projektplaner:
http://178.77.101.236/ppws/
Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.
Danke. :)
-
Hi, nimm mal eine LinkedList statt der ArrayList
Die ArrayListe erzeugt nämlich für den PrimaryKey 40000 erstmal 40000 leere Entries
Grüße
gore
-
23.03.10 13:05 #4
- Registriert seit
- Aug 2005
- Ort
- Karlsruhe (Baden-Württemberg)
- Beiträge
- 905
Die ArrayListe erzeugt ein so großes Array, wie nötig ist um die Anzahl an Elementen die kommen sicher zu speichern, plus einem Puffer damit nicht laufend das Array "vergrößert" werden muss.
Ich würde mal schauen, ob das Resultset oder sonstige DB-Sachen geschlossen werden.
P.S.: Entscheide dich bitte für ein Forum, wenn du ein Anliegen hast.Wäre super wenn ihr euren Code in dieser Form einfügt:
[java]System.out.println("Hello World");[/java]Code java:1
System.out.println("Hello World");
Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
Blog: http://javaeffective.wordpress.com/
Ähnliche Themen
-
Heap Size zu klein
Von MariusMeier im Forum JavaAntworten: 10Letzter Beitrag: 07.07.08, 16:58 -
Heap Corruption
Von NBOne im Forum C/C++Antworten: 1Letzter Beitrag: 14.01.08, 12:27 -
ArrayList in einer ArrayList
Von xXchrissiXx im Forum JavaAntworten: 8Letzter Beitrag: 10.04.07, 10:14 -
Inhalt einer ArrayList in andere ArrayList kopieren
Von Pierre im Forum .NET ArchivAntworten: 2Letzter Beitrag: 05.07.05, 16:58 -
Heap erstellen - wie?
Von RealScorp im Forum Visual Basic 6.0Antworten: 2Letzter Beitrag: 12.11.04, 10:17





Zitieren
Login





