Objekt aus Heap entfernen

TimoTH

Mitglied
Hallo zusammen!
Ich stehe hier vor einem kleinen Problem. Ich habe in meinem Programm leider einen kleinen "Speicherfresser drin". Das betreffende Objekt habe ich identifizieren können. aus dem Heap entfernen kann ich es leider nicht, da unzählige Referenzen auf dieses Objekt existieren.
Da dieses Programm recht groß ist, und niemand den wirklichen Durchblick hat, schaffe ichs auch nicht, all diese Referenzen zu entfernen...

Es scheint ja leider keine einfache Möglichkeit zu geben, ein solches Objekt vollständig zu entfernen. Vor kurzem gabs hier einen Thread mit einem ähnlichen Problem, welcher PhantomReferences und ReferenceQueue genutzt hat. Ich nehme fast an, das mit dies auch bei meinem Problem helfen würde.. nur.. mir fehlt da irgendwie das Verständniss für confused:

Vielleicht kann mir da ja jemand auf die Sprünge helfen?!

*gruß*
Timo
 
Hi,

Der Garbadge Collector löscht alle Objekte, die nicht mehr referenziert werden, weiche Zeiger ausgenommen. Also erst wenn der letzte "harte" Zeiger weg ist, verschwindet auch das Objekt.

Dein Problem ist ja, dass Du die harten Referenzen nicht wegbekommst, wenn ich das richtig verstanden habe. Da können die weiche Referenzen auch nicht helfen. Erst recht nicht, wenn der Code nicht mehr transparent ist.

Wenn irgend möglich, steck Deine Energie lieber in ein Redesign. Die Zeit ist sicher besser investiert. Selbst wenn Du einen Weg findest, was ich bezweifele, würde dadurch das Programm nur noch undurchaubarer...

Ist das Speicherleck denn für die Anwendung kritisch?

Gruss
 
Erstmal danke für die Antworten!

@limago Kritsch?. Hmm ist so Definitionssache... Pro Tag werden so ca 10 MB "weggefressen". Unschön ist es auf jeden Fall.

@Thomas
Werd ich mir mal anschauen. Hatte schonmal JHat laufen, aber das war mir ein wenig unübersichtlich..

*gruß*
Timo
 
Hello again!
Habe jetztmal den SAP Memory Analyzer ausprobiert. Fand ich deutlich übersichtlicher als alles was ich bis jetzt kennengelernt habe. Mit ihm hab ich jetzt auch alle harten Referenzen auf mein Problem Obejkt wegbekommen. Nur, eingesammelt wird es nicht..
Auch wenn man es nicht tun sollte, hab ich nun ein paarmal versuchsweise System.gc() aufgerufen.. ohne Erfolg.. Über die entsprechedne Debug Meldung habe ich aber gesehen, das der GC gestartet wurde...

Dann habe ich mal die JConsole gestartet und dort mal probeweise "Perform GC" aufgerufen... Meines Verständnisses nach auch nur ein simpler Aufruf des Garbage Collectors.. Und oh Wunder.. das Objekt wurde aus dem Heap entfernt...

Ich bin da ein wenig ratlos.. kann mir das jemand erklären?

*gruß*
Timo
 
Also ganz genau weiß ich es nicht, aber der der GC ist ein realtiv komplexes Ding. Es gibt verschiedene Verfahren wie ein GC arbeiten kann. Da gibt es "mark and sweep", "mark and compact" und andere Verfahren. Der SUN GC vereint die Vor- und Nachteile der einzelnen Verfahren. Er geht davon aus, das die meisten Objekte kurzlebig sind.

Der Speicher für solche Objekte wird in zwei Teile aufgeteilt. Neue Objekte kommen, sagen wir, in den Bereich 1. Das geht bis der Bereich voll ist. Dann kopiert der GC alle noch lebenden Objekte in den Bereich 2. Dadurch wird der Bereich kompaktiert. Neue Objekte kommen jetzt auch inden Bereich 2 bis er voll ist. Dann Kopieren nach 1 usw.

Dieses Verfahren ist für kurzlebige Objekte gut. Deswegen kommen Objekte die mehrere Kopiervorgänge überlebt habe in den Bereich für die ältere Generation. Hier läuft ein anderer Alogorithmus, der auch seltener prüft. Überlebt ein Objekt auch dies mehrfach, kommt es in den "persistenen" Bereich. Dort lebt es "ewig".

Man kann das Verhalten des GCs und die Größe dieser Bereiche über Startparameter steuern.

Hier eine gute Seite dazu:

http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

Hoffe das hilft ein wenig..

EDIT: Das mit dem permanenten Bereich stimmt so nicht. sondern

A third generation closely related to the tenured generation is the permanent generation. The permanent generation is special because it holds data needed by the virtual machine to describe objects that do not have an equivalence at the Java language level. For example objects describing classes and methods are stored in the permanent generation.

Das ändern aber nix an der Sache...
 
Zuletzt bearbeitet:
Bei nährerer Betrachtung des Heaps in der JConsole, ist mir aufgefallen, dass der "Code Cache" langsam aber stetig immer mehr Speicher benötigt.. Kann das denn sein?
Dieser Bereich ist ja eigentlich für den Interpreter und den JIT gedacht. Nach einer gewissen Zeit, sofern nicht neue Klassen dazu kommen und diese wieder übersetzt werden müssen, müsste der Speicherverbrauch ja konstant bleiben, oder nicht?

Ich lass das Programm nun mal still weiter vor sich hin laufen, bin mal gespannt, ob der Code Cache weiter steigt..
Aber vielleicht hat da ja jemand schon ne Meinung zu?

*gruß*
Timo
 
Zurück