Hence, each thread is provided with a local free list from the main heap. This prevents frequent synchronization. It uses a four color marking, similar to tricolor, except that the color blue signifies the free-list objects. The collector starts by marking all roots, and tracing the heap. When the last thread has finished marking its roots, then the collector can finish its tracing.
Objects can become reachable by allocation, or by in-place modification.
When this happens during tracing, then both the new and old objects are marked gray. When the thread reads the flag, it marks its roots. A thread can execute a program that does not allocation. It can be blocked on a lock. In can of looping, the major collector forces a minor collection.