在runtime包下mgc.go中明确的说明了Golang的GC的解释// Garbage collector (GC).//// The GC runs concurrently with mutator threads, is type accurate (aka precise), allows multiple// GC thread to run in parallel. It is a concurrent mark and sweep that uses a write barrier. It is// non-generational and non-compacting. Allocation is done using size segregated per P allocation// areas to minimize fragmentation while eliminating locks in the common case.//// The algorithm decomposes into several steps.// This is a high level description of the algorithm being used. For an overview of GC a good// place to start is Richard Jones' gchandbook.org.//// The algorithm's intellectual heritage includes Dijkstra's on-the-fly algorithm, see// Edsger W. Dijkstra, Leslie Lamport, A. J. Martin, C. S. Scholten, and E. F. M. Steffens. 1978.// On-the-fly garbage collection: an exercise in cooperation. Commun. ACM 21, 11 (November 1978),// 966-975.// For journal quality proofs that these steps are complete, correct, and terminate see// Hudson, R., and Moss, J.E.B. Copying Garbage Collection without stopping the world.// Concurrency and Computation: Practice and Experience 15(3-5), 2003.//// 1. GC performs sweep termination.//// a. Stop the world. This causes all Ps to reach a GC safe-point.//// b. Sweep any unswept spans. There will only be unswept spans if// this GC cycle was forced before the expected time.//// 2. GC performs the "mark 1" sub-phase. In this sub-phase, Ps are// allowed to locally cache parts of the work queue.//// a. Prepare for the mark phase by setting gcphase to _GCmark// (from _GCoff), enabling the write barrier, enabling mutator// assists, and enqueueing root mark jobs. No objects may be// scanned until all Ps have enabled the write barrier, which is// accomplished using STW.//// b. Start the world. From this point, GC work is done by mark// workers started by the scheduler and by assists performed as// part of allocation. The write barrier shades both the// overwritten pointer and the new pointer value for any pointer// writes (see mbarrier.go for details). Newly allocated objects// are immediately marked black.//// c. GC performs root marking jobs. This includes scanning all// stacks, shading all globals, and shading any heap pointers in// off-heap runtime data structures. Scanning a stack stops a// goroutine, shades any pointers found on its stack, and then// resumes the goroutine.//// d. GC drains the work queue of grey objects, scanning each grey// object to black and shading all pointers found in the object// (which in turn may add those pointers to the work queue).//// 3. Once the global work queue is empty (but local work queue caches// may still contain work), GC performs the "mark 2" sub-phase.//// a. GC stops all workers, disables local work queue caches,// flushes each P's local work queue cache to the global work queue// cache, and reenables workers.//// b. GC again drains the work queue, as in 2d above.//// 4. Once the work queue is empty, GC performs mark termination.//// a. Stop the world.//// b. Set gcphase to _GCmarktermination, and disable workers and// assists.//// c. Drain any remaining work from the work queue (typically there// will be none).//// d. Perform other housekeeping like flushing mcaches.//// 5. GC performs the sweep phase.//// a. Prepare for the sweep phase by setting gcphase to _GCoff,// setting up sweep state and disabling the write barrier.//// b. Start the world. From this point on, newly allocated objects// are white, and allocating sweeps spans before use if necessary.//// c. GC does concurrent sweeping in the background and in response// to allocation. See description below.//// 6. When sufficient allocation has taken place, replay the sequence// starting with 1 above. See discussion of GC rate below.