KartoffelKiffer
Mitglied
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
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
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:
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