Anzeige:
Ergebnis 1 bis 5 von 5

Thema: Wie behandelt man heap in java?

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.06.2005
    Beiträge
    22

    Question Wie behandelt man heap in java?

    Hallo Leute,

    ich habe ein Heap-Problem, das Euch allen wahrscheinlich bekannt sein soll:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

    Nun habe ich schon etwas über Heap gelesen und ich denke ich verstehe schon, was das ist. Allerdings habe ich absolut
    keine Information dazu gefunden, wie man solche Probleme löst. Die magische Zeile System.gc(); funktioniert bei mir nicht
    (ist wohl auch nicht nur bei mir der Fall) und sonst habe ich keine Ahnung, wie man damit umgeht.

    Es ist wohl möglich für java mehr heap zu besorgen, die Lösung finde ich aber nicht optimal, weil man das sonst an jedem Rechner machen müsste,
    wo dieses Program gestartet werden soll.

    Kurz zum Programm-Aufbau:
    Im ersten Schritt werden PDF-Dateien in .txt konvertiert.
    Im zweiten Schritt werden aus .txt Dateien n-gramme extrahiert, in die neuen .txt Dateien werden die Hash-Werte und entsprechende Strings
    geschrieben
    Im dritten Schritt werden die Dateien mit Hashwerten einglesen und eine Art inverted Index erstellt mit dem Hash-Wert und den Dateinamen.
    Der Index wird zuerst in eine Hashtable geschrieben und dann in eine .txt Datei
    Im vierten Schritt wird das gleiche gemacht, nur dass das ganze in Berkeley DB gespeichert wird
    (Schritt 3 wird eigentlich nur zum Vergleich gemacht)

    Das OutOfMemoryError taucht immer im 4. Schritt auf. Wenn alle Schritte durchlaufen werden, bekomme ich den Fehler schon beim erzeugen des
    Datenbank Objekts. Wenn ich nur den Schritt 4 starte, läuft das Programm durch, aber im VM Telemetry Window sehe ich,
    dass immer mehr heap gebraucht wird. Jetzt, wo ich nur 40-50 Dateien habe ist das zwar nicht so schlimm, wenn ich aber 10000 Dateien habe,
    könnte es richtig problematisch werden.

    Gibt es denn irgendeine Möglichkeit es zu erzwingen, dass Heap nach jedem Schritt gereinigt wird (System.gc(); geht nicht)?
    Ich wäre auch sehr dankbar für jede Information, wie man mit Heap und Garbage Collection umgeht, aber eben konkrete Tipps
    keine allgemeinen Informationen. Wenn möglich auch für Anfänger geeignet.

    Vielen Dank im Voraus.

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Man kann meines Wissens Speicher nicht explizit freigeben.

    Wenn der Garbage Collector nicht freigibt, werden vielleicht noch Referenzen auf Objekte gehalten, d.h. du könntest erstmal kontrollieren, ob due Java überhaupt die Möglichkeit gibst aufzuräumen.

    Eine weitere Möglichkeit wäre zu untersuchen, wie weit Objekte wieder verwendet werden können.

    Oder du konzipierst die Verarbeitungskette nicht als ein Programm mit mehreren Aufgaben, sondern als Reihe von Programmen mit jeweils einer Teilaufgabe.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.06.2005
    Beiträge
    22
    Danke für die Antwort. Den ersten Teil des Problems habe ich gelöst. Ich habe einfach den Hashtable nach dem 3 Schritt auf null gesetzt, jetzt werde ich es noch versuchen mit der Datenbank zurechtzukommen.

  4. #4
    Registrierter Benutzer Avatar von mwanaheri
    Registriert seit
    28.10.2003
    Ort
    Bayreuth
    Beiträge
    569
    Probleme mit dem Heapspace sind m:E. meistens auf unbedachte Objekterzeugung zurückzuführen. Was häufig vorkommt: In einer Schleife eine (Objekt-) variable erzeugen. Besser: Variable vor der Schleife anmelden und in der Schleife nur belegen. So was kann irre Platz sparen.
    Das Ziel ist das Ziel.

  5. #5
    Registrierter Benutzer
    Registriert seit
    07.05.2003
    Beiträge
    127
    Zitat Zitat von mwanaheri Beitrag anzeigen
    In einer Schleife eine (Objekt-) variable erzeugen. Besser: Variable vor der Schleife anmelden und in der Schleife nur belegen. So was kann irre Platz sparen.
    Objecte, auf die nicht mehr verwiesen wird, werden freigegeben vom gc. Für die Performance ist das Anlegen von einmal benötigten Objekten nicht optimal, für den Speicherverbrauch allerdings irrelevant.
    Man kann den zur Verfügung stehende heap mit den Parametern "ms" und "mx" anpassen, also z.B.
    java -Xms512M -Xmx1024M
    Standard sind 64MB, die leicht mal zu eng werden.

    HTH
    mamue

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •