一尘不染

Go 使用什么样的垃圾回收?

go

Go 是一种垃圾收集语言:

http://golang.org/doc/go_faq.html#garbage_collection

这里说它是一个标记和清除垃圾收集器,但它没有深入研究细节,并且正在开发替代品……然而,自 Go 发布以来,这一段似乎没有更新太多。

它仍然是标记和清除?它是保守的还是精确的?是一代吗?


阅读 217

收藏
2021-11-24

共1个答案

一尘不染

Go 1.4+ 垃圾收集器的计划:

  • 混合停止世界/并发收集器
  • stop-the-world 部分限制在 10 毫秒的最后期限内
  • 专用于运行并发收集器的 CPU 内核
  • 三色标记扫描算法
  • 非世代
  • 非压实
  • 完全精确
  • 如果程序四处移动指针,则会产生很小的成本
  • 比 Go 1.3 GC 更低的延迟,但很可能也更低的吞吐量

在 Go 1.1 之上的 Go 1.3 垃圾收集器更新:

  • 并发扫描(导致更短的暂停时间)
  • 完全精确

Go 1.1 垃圾收集器:

  • mark-and-sweep(并行实现)
  • 非世代
  • 非压实
  • 大部分精确(堆栈帧除外)
  • 停止世界
  • 基于位图的表示
  • 当程序不分配内存时零成本(即:混洗指针与 C 中一样快,尽管实际上这比 C 运行得慢一些,因为 Go 编译器不如 GCC 等 C 编译器先进)
  • 支持对象的终结器
  • 不支持弱引用

Go 1.0 垃圾收集器:

  • 与 Go 1.1 相同,但垃圾收集器不是最精确的,而是保守的。保守的 GC 能够忽略诸如 []byte 之类的对象。

用不同的 GC 替换 GC 是有争议的,例如:

  • 除了非常大的堆外,尚不清楚分代 GC 是否总体上会更快
  • 包“不安全”使得很难实现完全精确的 GC 和压缩 GC
2021-11-24