Go 正在构建的 GC 不仅仅是面向于 2015 年,而是面向于 2025 年甚至更久之后:一个支持当局的软件开发并且可以同未来十年新的软件硬件一同扩展的 GC。
Go 1.5,是看到未来的第一瞥,成功完成了我们一年前设定的 GC 延迟小于 10ms 的目标。这篇文章综述了我们在 Go 1.5 的垃圾回收器上做了什么。
Embellishment(润色)
Go 的新 GC 是一个 并发的、三色的、标记清除的垃圾回收器(a concurrent, tri-color, mark-sweep collector)。我们相信它会非常适合于新时代硬件的性能和新时代软件的低延迟需求。
- 在三色收集器中,每一个对象可以有三种颜色:白、灰、黑,我们把 堆(heap)视为一张对象连接起来的图。
- 在 GC 循环开始的时候,所有的对象都是白色的。
- GC 先访问所有的 根(roots)标记它们为灰色。根(变量)这个是应用程序直接访问的对象,比如全局变量、栈上的变量。
- 然后 GC 选择一个灰色对象,标记为黑色,然后扫描它引用的其他变量。
- 当扫描找到对白色变量的引用时,将这个变量标记为灰色。
- 以上步骤重复直到不再有灰色的对象,这时,白色的变量就被认为是不可达的,就可以被回收了。
这些步骤都(?)发生在与应用程序并发阶段,(这个应用程序)被称为 mutator
(翻译为“赋值器”),是它在垃圾回收进行时改变了变量的引用。
因为 mutator
必须保持没有黑色对象指向白色对象,以免 GC 跟丢它在堆上已经访问过的变量。
维持这种不变是 写屏障(write barrier)的职责,它是 mutator
在堆中的指针被更新时运行的一个小函数(function)。
如果当前可达对象是白色,Go 的写屏障标记它为灰色,以确保 GC 最终能扫描到它的引用。
确认在什么时候所有的灰色对象被完全标记完了很微妙,而且如果我们想避免 block 应用程序(mutators)代价非常昂贵而且复杂。为了让事情简单, Go 1.5 做足了工作让它可以并行,然后短暂地 STW 去检查所有潜在的灰色对象。找到最终 STW 所需的时间与该 GC 所做的工作总量之间的最佳结合点是在 Go 1.6 主要交付的内容。
魔鬼在于细节。GC 过程的具体细节的低级讨论就不在这里讨论了(可参考原文有哪些问题)。
在更高级别上,解决 Go 性能问题的方法是增加了 GC 旋钮(knobs),每一个性能问题有一个旋钮。程序员可以旋转这个旋钮来为他们的应用程序寻找合适的设置。不利的一面是,在十年之后你每年使用一个或两个新的旋钮,你终将遇到《GC 旋钮开关使用法》(GC Knobs Turner Employment Act),Go 不会走这条路。转而,Go 提供了一个旋钮,它叫 GOGC。
GOGC 控制了涉及到可达对象空间的堆的总大小。默认是 100,意味着在上一次收集之后,堆的大小比可达对象的空间大小大 100% 倍(也就是两倍大)。200 就意味着是 3 倍大。如果你想降低 GC 的总时间,那就增加 GOGC;如果你想用更多的 GC 时间来换取更少的内存,那就降低 GOGC。
更重要得,随着下一代硬件中 RAM 增倍(双倍),简单地设置 GOGC 增倍(双倍)将使用 GC 循环数减半。另一方面,既然 GOGC 是根据可达对象的空间大小来的,将可达对象增倍来让负载增倍不需要重调(retune)。应用自己扩展了。更进一步得,没有众多旋钮(knob)的困扰,团队可以专注于客户应用的反馈提高运行性能。
Punchline(点睛之笔)
Go 1.5 指向了一个未来,在未来 STW 的暂停不再是使用安全语言的屏障,应用可以轻松得与硬件扩展,并且随着硬件变得越来越强大,GC 将不会成为更好、更具可扩展性的软件的障碍。
更多 1.5GC 的相关内容及我们怎么降低延迟问题可以参考:Go GC: Latency Problem Solved presentation 和 the slides。
总结
上面提到了这些术语和概念:
- GO 的 GC 是并发的、三色标记的、标记清除 垃圾收集器,上面讲述了 GC 的过程。
- 写屏障(Write Barrier)
- GC Knobs(GC 旋钮)
- GOGC,一个 GC Knobs,控制它可控制堆与可达对象空间的大小比例
- 增加 GOGC 可降低 GC 总时间;降低 GOGC 更节省内存
下面赋两张 PPT 中的图:
GO 与 Java GC 的比较 GO GC 步骤- 文章来自于Go Blog:Go GC: Prioritizing low latency and simplicity(2015.8.31)
- 搜了一下找到了中文翻译版,地址:https://learnku.com/docs/go-blog/go15gc,但它的翻译也不太好,所以我这里参考它的翻译用自己的语言再写一下
- Go GC: 低延迟问题解决的描述 及 PPT 文档
- 一篇很详尽的 Go GC 文章
网友评论