| |
12
wird (Bed. 1), soll durch eine Snapshot-Barrier sichergestellt werden, dass ursprüngli-
che, überschriebene Verweise noch nachvollzogen werden können Bed. 2
nicht
greift).
Bei Yuasa werden außerdem (kurzlebige) neue Objekte während der GC-Phase direkt
schwarz markiert und können deshalb auch nicht mehr während der GC-Phase einge-
sammelt werden, falls sie bereits während des Vorgangs absterben. Während Dijkstra
neue Objekte ebenfalls schwarz oder grau markiert, benutzt Steele eine Heuristik, die
dafür sorgt, dass neue Objekte schwarz, grau oder weiß markiert werden, abhängig da-
von, wie weit der GC-Zyklus schon fortgeschritten ist (vgl. S. 194f. Jo96].
Markierungsvorgang
Als Abschluss zur Klasse der Mark-Sweep-Collector wird nun erklärt, wie bei Steele
der Markierungsvorgang, der in Algorithmus 3 dargestellt ist, im Detail abläuft.
mark() =
phase = mark_phase
for R in Roots
gcpush(R,mark_stack)
mark1()
for S in system_stack
LOCK S, system_stack
gcpush(S,mark_stack)
mark1()
LOCK gcstate
finished = mark_stack=empty
while not finished
mark1()
LOCK gcstate
finished = mark_stack=empty
mark1() =
while mark_stack ? empty
X= gcpop(mark_stack)
if unmarked(x)
LOCK X
for Y in Children(X)
gcpush(*Y,mark_stack)
colour(X) = black
Quelle: [S.195, Jo96]
Algorithmus 3: Steeles Concurrent Marker
Zuerst werden in der Markierungsphase alle Objekte des Root Sets jeweils auf den
Mark-Stack gelegt (gcpush) und die Tracing-Funktion mark1() aufgerufen. Dort wird
das oberste Element des Mark-Stacks (X) untersucht. Ist es unmarkiert, wird es solange
gesperrt, bis die Verweise von allen referenzierten Kindobjekten (Y) auch auf den
Mark-Stack gelegt worden sind. Beim System-Stack wird ähnlich vorgegangen, nur
|  |
|
| |
|
|