Garbage Collection
... [ Seminar WWW und JAVA] ... [ Thema Java Virtual Machine ] ... [ Literaturverzeichnis ] ...
Übersicht: Garbage Collection
Aufgaben des Garbage Collectors
Der Garbage Collector gibt Speicher für nicht mehr benötigte Objekte wieder frei.
Ausserdem muss der Garbage Collector alle Finalizer-Methoden der Objekte ausführen, bevor er deren Speicher freigibt.
Der Garbage Collector muß um Speicher freizugeben, herausfinden, welche Objekte nicht mehr gebraucht werden. Hierbei muß er auch alle Finalizer-Methoden der Objekte ausführen.
Bei der Garbage Collection muß auch darauf geachtet werden, daß der Heap nicht zu stark fragmentiert wird.
Der Garbage Collector läuft normalerweise transparent als eigener Thread neben dem eigentlichen Programm.
Der Garbage Collection kann im Bedarfsfall auch durch die Methoden system.gc()
oder runtime.gc()
"manuell" ausgelöst werden.
Es kann nicht vorausgesagt werden, wann die Finalizer Methode eine Objekts durch den Garbage Collector tatsächlich ausgeführt wird. Es ist also nicht sicher, daß von einem Objekt sofort die Finalize-Methode ausgeführt wird, wenn es nicht mehr referenziert wird. Ein Programmierer hat also selbst dafür Sorge zu tragen, daß er Resourcen wie Dateien selbst wieder freigibt und sich nicht auf den Garbage Collector verläßt.
Bevor die Objekte gelöscht werden, muß noch die Finalize-Methode des Objekts ausgeführt werden.
Um herauszufinden, welche Objekte nicht mehr referenziert werden, werden üblicherweise eine Menge sog. "roots" angelegt und die Ereichbarkeit von diesen Wurzeln untersucht.
Ein Objekt ist erreichbar, wenn es einen Pfad von Referenzen ausgehend von der Wurzel gibt, über die ein Programm das Objekt erreichen kann. Die Wurzeln sind immer vom Programm erreichbar. Objekte die nicht mehr erreichbar sind können vom Heap entfernt werden.
Die "roots" beinhalten typischer Weise:
· lokale Variablen aller Methoden der Java Stacks die eine Objektreferenz sind.
· Alle Objektreferenzen aus dem Constant Pool die auf den Heap zeigen.
Die Roots beinhalten also alles von dem die Möglichkeit besteht auf Objekte im Heap zu verweisen.
Referenz Counting Collector
Beim "Referenz Counting Collector" wird für jedes Objekt ein Referenzzähler gepflegt, der beim Erstellen des Objekts auf Eins gesetzt wird.
Wird ein neues Objekt mit einer Referenz auf dieses Objekt erstellt, so wird der Zähler um 1 erhöht.
Wird eine Referenz auf das Objekt gelöscht bzw. mit einem neuen Wert versehen, so wird der Zähler um 1 erniedrigt.
Objekte, deren Zähler 0 erreichen, können gelöscht werden.
- Vorteil:
Kann unterbrochen in relativ kleinen Zeitstücken ausgeführt werden.
- Nachteile:
- Der Algorithmus kann keine Zyklen erkennen.
Referenziert beispielsweise ein Objekt A ein Objekt B, das ein Objekt C referenziert, so kann, wenn Objekt C Objekt B referenziert, der Zähler von B und C nicht mehr Null erreichen, auch wenn A gelöscht wird.
- Overhead zur Verwaltung des Zählers.
Tracing Collectors
Bei den Tracing Collectors wird ausgehend von den Wurzeln der Graph der Referenzen durchgangen und alle Objekte, die darüber erreicht werden, werden markiert.
Die Objekte die nach dem Durchlaufen nicht markiert sind können gelöscht werden, da sie auch vom Programm nicht mehr anzusprechen sind.
Tracing collectors werden als "mark and sweep" bezeichnet.
Compacting Collectors
Beim Compacting Collector werden die Objekte zu einem Ende des Heaps verschoben. Hierbei bildet sich ein zusammenhängender freier Speicherbereich am anderen Ende des Heaps.
Alle Referenzen auf die bewegten Objekte müssen danach erneuert werden.
Das Erneuern der Referenzen kann dadurch vereinfacht werden, daß die einzelnen Referenzen nicht direkt auf das Objekt verweisen, sondern auf ein Objekt-Handle in einer Objekttabelle, über den das Objekt referenziert wird.
Dadurch müssen nicht mehr die einzelnen Referenzen auf ein Objekt verändert werden, sondern nur die Adresse, auf die das Handle verweist.
Copy Collectors
Der Copy Collector teilt den Heap in zwei Teile. Nur einer dieser Teile wird auf einmal benutzt. In Diesem werden die Objekte ganz normal erzeugt.
Wenn der Platz in diesem Heap-Teil nicht mehr ausreicht, wird die Ausführung des Programms unterbrochen, der Copy Collector kopiert alle noch lebenden Objekte in den zweiten Teil, und dieser Teil des Heap wird zum aktiven Teil.
Der ursprünglich benutzte Teil des Heaps wird dann als frei markiert.
Alle toten Objekt gehen dadurch verloren.
- Vorteil:
Es gibt keine zwei Phasen, wie bei der "mark and sweep"-Methode.
Die Objekte werden "on the fly" während des Durchschreitens des Referenzgraphen kopiert.
- Nachteil:
Der Heap muß doppelt so groß sein wie eigentlich notwendig.
... [ Seminar WWW und JAVA ] ... [ Thema Java Virtual Machine ] ... [ Garbage Collection ] ... [ Literaturverzeichnis ] ...