Skip to content

Latest commit

 

History

History
44 lines (29 loc) · 3.37 KB

File metadata and controls

44 lines (29 loc) · 3.37 KB

垃圾回收器: 过去、现在与未来

[TOC]

Go 1

Go 1.3

Go 1.5

Go 1.6

Go 1.7: Dijkstra 插入屏障

Go 1.7 使用了纯 Dijkstra 插入屏障技术 [Dijkstra et al. 1978]。 早期的 Go 选择了在 STW 期间,重新对栈进行扫描。垃圾收集器首先在 GC 循环开始时扫描所有栈从而收集根。 但是如果没有栈的写屏障,我们便无法确保堆栈以后不会包含对白色对象的引用,因此扫描栈只有黑色,直到其 goroutine 再次执行, 因此它保守地恢复为灰色。从而在循环结束时,垃圾回收器必须重新扫描灰色堆栈以使其变黑并完成标记任何剩余堆指针。 由于必须保证栈在此期间不会继续更改,因此重新扫描过程在 STW 时发生。实践表明,栈的重扫需要消耗 10 - 100 毫秒的时间。

Go 1.8, 1.9

Go 1.12

Go 1.13

进一步阅读的参考文献

许可

Go under the hood | CC-BY-NC-ND 4.0 & MIT © changkun