Der
Speicher wird periodisch nach Objekten durchsucht, die von laufenden
Programmen aus noch erreicht werden können.
Üblicherweise
werden zu diesem Zweck alle Wurzeln auf einen Stack gelegt und dann
die jeweils oberste Referenz bearbeitet, bis der Stack leer ist. Bei
der Bearbeitung wird zunächst geprüft, ob das referenzierte Objekt
bereits markiert wurde. Ist das nicht der Fall, so wird sein ,,Mark
Bit`` gesetzt (dies ist üblicherweise ein Bit im Objektkopf) und
alle Referenzen, die in diesem Objekt enthalten sind, werden auf den
Stack gelegt.
Wenn
alle erreichbaren Objekte markiert wurden, kann vom restlichen
Speicher angenommen werden, dass dieser frei ist.
In
der Sweep-Phase wird der Heap linear durchlaufen und unmarkierte
Speicherbereiche werden einer oder mehreren Freispeicherlisten zugefügt
- folgende Allokationen werden dann aus diesen Listen bedient. Während
der linearen Suche durch den Heap werden weiterhin alle Markierungen
zurückgesetzt, damit diese bei der nächsten Garbage Collection zur
Verfügung stehen.
Um
eine Fragmentierung des Speichers zu verhindern, endet dieses
Verfahren oft damit, dass der Speicher so umgeordnet wird, dass der
freie Speicher ein einziger Block ist.
Während
die Garbage Collection mit diesem Verfahren läuft, ist das System
in einem unstabilen Zustand
"tote"
Objekte werden entfernt, "lebende" Objekte erkannt und
Referenzen auf Objekte erneuert
Automatischer
Ablauf ohne Unterbrechungen
Performanceeinbußen
in Systemen mit viel Speicher.
dieses
Verfahren ist schlecht für Echtzeit-Anforderungen.
|