如今灰色的对象被参加到扫描队列并被标记为黑色:
对参加到扫描队列的一切对象重复做相反的操作,直到没有对象需求被处置:
处置完毕时,黑色对象表示内存中在运用的对象,白色对象是要被回收的对象。我们可以看到,由于 struct2 的实例是在一个匿名函数中创立的且不再存在于栈上,因此它是白色的且可以被回收。
归功于每一个 span 中的名为 gcmarkBits 的 bitmap 属性,三色被原生地完成了,bitmap 对 scan 中相应的 bit 设为 1 来追踪 scan。
我们可以看到,黑色和灰色表示的意义相反。处置的不同之处在于,标记为灰色时是把对象参加到扫描队列,而标记为黑色时,不再扫描。
GC 最终 STW,肃清每一次写屏障对 work pool 做的改动,继续后续的标记。
你可以在我的文章 Go GC 怎样监控你的运用[5] 中找到关于并发处置和 GC 的标记阶段更详细的描画。
runtime 剖析器
Go 提供的工具使我们可以对每一步停止可视化,察看 GC 在我们的顺序中的影响。开启 tracing 运转我们的代码,可以看到前面一切步骤的一个概览。下面是追踪结果:
标记 worker 的生命周期也可以在追踪结果中以协程等级可视化。下面是在启动之前先在后台等候标记内存的 Goroutine #33 的例子。
【编辑引荐】
干货分享:用 Go 从头完成一个迷你 Docker—Gocker
片面比较Rust与Go言语
云原生的 Java与Golang
Go 言语一次真实的错误吞并的经验
开源 Go 项目引荐:将汉字转拼音,居然能带声调
(责任编辑:admin)