| |
14
Abb. 3 : Tospace in Bakers Algorithmus
Objekte, die von Fromspace in Tospace kopiert werden, belegen den freien Bereich von
links ab dem Punkt B. Neue Objekte werden während der GC von rechts ab dem Punkt T
in den Speicher geschrieben, d.h. sie werden direkt als schwarze Objekte angesehen.
Einerseits müssen diese nicht mehr untersucht werden, andererseits kann der von ihnen
belegte Speicher während des aktuellen GC-Zyklus nicht mehr freigegeben werden,
falls sie nicht mehr gebraucht werden. Es gibt unterschiedliche Strategien, wann die
beiden Semi-Spaces getauscht werden. Tauscht man erst, wenn die Zeiger B und T sich
treffen, gibt man Objekten so viel Zeit wie möglich zu sterben, benötigt aber einen ma-
ximalen Anteil des Heaps, was auch die Zahl von Page-Faults erhöht. Tauscht man so-
bald scan B erreicht hat, so wird ein kleinerer Anteil im Heap belegt und weniger Page-
Faults erzeugt. Im folgenden Algorithmus 4 ist Bakers Algorithmus genauer dargestellt:
New(n) =
if B = T-n
if scan < B
abort Havent finished scavenging
flip()
for root R
R = copy (R)
repeat k times while scan < B
for P in Children(scan)
*P = copy (*P)
scan = scan + size(scan)
if B==T
abort Heap full
T = T - n
return T
read(T) =
T=copy(T)
return(T)
Quelle [S.204, Jo96]
Algorithmus 4: Bakers inkrementeller kopierender Algorithmus
Wird ein Objekt mit n Wörtern neu alloziiert, so wird zuerst geprüft, ob der freie Spei-
cherplatz ausreicht, d.h. ob die Zeiger B und T mehr als n Wörter auseinander sind (vgl.
Abb. 3). Ist das nicht der Fall, so wird geprüft, ob der Collect-Vorgang schon abge-
schlossen ist (scan < B) und falls nicht wird der Allokationsvorgang abgebrochen. An-
sonsten werden durch die flip()-Funktion die beiden Semi-Spaces getauscht und der
neue Tospace-Bereich falls nötig erweitert [Jo96], wonach die Rootelemente kopiert
Tospace
scan
alloc
copy
B
T
|  |
|
| |
|
|