Go 使用什么样的垃圾收集器? [英] What kind of Garbage Collection does Go use?
问题描述
Go 是一种垃圾收集语言:
Go is a garbage collected language:
http://golang.org/doc/go_faq.html#garbage_collection
这里说它是一个标记和清除垃圾收集器,但它没有深入研究细节,并且正在开发替代品......然而,自从 Go 出现以来,这一段似乎没有更新太多发布.
Here it says that it's a mark-and-sweep garbage collector, but it doesn't delve into details, and a replacement is in the works... yet, this paragraph seems not to have been updated much since Go was released.
它仍然是标记和清除?它是保守的还是精确的?是世代相传的吗?
It's still mark-and-sweep? Is it conservative or precise? Is it generational?
推荐答案
Go 1.4+ 垃圾收集器计划:
Plans for Go 1.4+ garbage collector:
- 混合 stop-the-world/并发收集器
- 在 10 毫秒的最后期限内停止世界部分
- 专用于运行并发收集器的 CPU 内核
- 三色标记和扫描算法
- 非代际
- 非压缩
- 完全精确
- 如果程序四处移动指针会产生少量成本
- 与 Go 1.3 GC 相比,延迟更低,但吞吐量也很可能更低
Go 1.3 垃圾收集器在 Go 1.1 之上的更新:
Go 1.3 garbage collector updates on top of Go 1.1:
- 并发扫描(导致更短的暂停时间)
- 完全精确
Go 1.1 垃圾收集器:
Go 1.1 garbage collector:
- mark-and-sweep(并行实现)
- 非代际
- 非压缩
- 大部分精确(堆栈帧除外)
- 停止世界
- 基于位图的表示
- 程序不分配内存时的零成本(即:四处混排指针与 C 中一样快,尽管在实践中这比 C 运行得慢一些,因为 Go 编译器不如 GCC 等 C 编译器先进)
- 支持对象的终结器
- 不支持弱引用
Go 1.0 垃圾收集器:
Go 1.0 garbage collector:
- 与 Go 1.1 相同,但垃圾收集器不是最精确的,而是保守的.保守的 GC 能够忽略诸如 []byte 之类的对象.
用不同的 GC 替换是有争议的,例如:
Replacing the GC with a different one is controversial, for example:
- 除了非常大的堆外,尚不清楚分代 GC 总体上是否会更快
- 包不安全"使得难以实现完全精确的 GC 和压缩 GC
这篇关于Go 使用什么样的垃圾收集器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!