A copying-type garbage collector operates in multiple concurrent threads.
Each thread evacuates potentially reachable objects from the from space
to the to space in a depth-first manner: if a thread has evacuated an
object containing references to any from-space objects, it evacuates all
of that object's descendants before it evacuates any other reachable
objects. To keep track of descendants that must be evacuated before
non-descendants can be, the thread places objects containing references
to non-evacuated objects into a linked list maintained by pointers that
it installs in the from-space locations from which the objects on the
list were evacuated. Additionally, it divides the to space into
local-allocation buffers ("LABs") to which respective threads exclusively
evacuate objects, and each thread maintains a LAB stack representing all
the LABs it has filled that still contain references to unevacuated
from-space objects. When a thread has completed evacuating the
descendants of evacuees in all of its LABs, it "steals" work from other
threads. It may do so, for instance, by processing a reference in an
object belonging to another thread's list, by transferring to its own
list one or more objects from another thread's list, or by transferring
to its own LAB stack one or more LABs from another thread's LAB stack.