Incremenatal Garbage Collectors
Goal: reduce pause times
Do not stop the program to do garbage collection
Instead, perform steps of garbage collection as the program is running
Consider this situation:
- collector already processes reachable node x and its fields
- program modifies x.f=y
- collector now needs to know that y is also reachable
Three kinds of objects:
- white - not visited yet (entirely unmarked)
- greay - marked bu their children not examined
- on the stack in mark-and-sweep
- between scan and next in copying collector
- black - marked and their children also marked
General algorithm:
while (there are any grey objects) { select a grey record p for (each field f_i of p) { if (record p.f_i is white) color record p.f_i grey } color record p black }
Key invariants:
- a black object does not point to a white object
- every grey object is in grey-set (the collector's data structure)
Example algorithm: Baker's algorithm
Starting collection:
- forward all roots
- swap to and from
Invariant: mutator only has pointers into to-space
When alloc called, allocated from end of to-space
- also scan a few records to make progress in collection
When mutator stores field, nothing special needed
- because of the invariant
When mutator loads, must forward the pointer
- to ensure invariant