tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
690
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    KartoffelKiffer KartoffelKiffer ist offline Mitglied Silber
    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
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    -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. :)

  3. #3
    gorefest gorefest ist offline Mitglied Brokat
    Registriert seit
    Apr 2009
    Beiträge
    256
    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
     

  4. #4
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Zitat Zitat von gorefest Beitrag anzeigen
    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.
     
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    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

  1. Heap Size zu klein
    Von MariusMeier im Forum Java
    Antworten: 10
    Letzter Beitrag: 07.07.08, 16:58
  2. Heap Corruption
    Von NBOne im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 14.01.08, 12:27
  3. ArrayList in einer ArrayList
    Von xXchrissiXx im Forum Java
    Antworten: 8
    Letzter Beitrag: 10.04.07, 10:14
  4. Inhalt einer ArrayList in andere ArrayList kopieren
    Von Pierre im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 05.07.05, 16:58
  5. Heap erstellen - wie?
    Von RealScorp im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 12.11.04, 10:17