Heap-Volllaufen bei ArrayList<Integer>

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

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.
 
Zurück