Golang采用了三色标记法来进行垃圾回收,那么在什么场景下会触发这个回收动作呢?
源码主要位于文件 src/runtime/mgc.go
go version 1.16
触发条件从大方面来说,分为 手动触发 和 系统触发 两种方式。手动触发一般很少用,主要通过开发者调用 runtime.GC()
函数来实现,而对于系统自动触发是 运行时
根据一些条件判断来进行的,这也正是本文要介绍的内容。
不管哪种触发方式,底层回收机制是一样的,所以我们先看一下手动触发,根据它来找系统触发的条件。
// src/runtime/mgc.go // GC runs a garbage collection and blocks the caller until the // garbage collection is complete. It may also block the entire // program. func GC() { n := atomic.Load(&work.cycles) gcWaitOnMark(n) // We're now in sweep N or later. Trigger GC cycle N+1, which // will first finish sweep N if necessary and then enter sweep // termination N+1. // 触发GC gcStart(gcTrigger{kind: gcTriggerCycle, n: n + 1}) // Wait for mark termination N+1 to complete. gcWaitOnMark(n + 1) ...... }
可以看到开始执行GC的是 gcStart()
函数,它有一个 gcTrigger
参数,是一个触发条件结构体,它的结构体也很简单。