A multiprocessor, multi-program, stop-the-world garbage collection program
is described. The system initially over partitions the root sources, and
then iteratively employs static and dynamic work balancing. Garbage
collection threads compete dynamically for the initial partitions. Work
stealing double-ended queues, where contention is reduced, are described
to provide dynamic load balancing among the threads. Contention is
resolved by using atomic instructions. The heap is broken into a young and
an old generation where parallel semi-space copying is used to collect the
young generation and parallel mark-compacting the old generation. The old
generation heap is divided into a number of contiguous cards that are
partitioned into subsets. The cards are arranged into the subsets so that
non-contiguous cards are contained in each subset. Speed and efficiency of
collection is enhanced by use of card tables and linking objects, and
overflow conditions are efficiently handled by linking using class
pointers. The garbage collection termination employs a global status word.