一尘不染

Go使用哪种垃圾收集?

go

Go是一种垃圾回收语言:

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

在这里,它说这是一个标志性的垃圾回收器,但是它没有深入研究细节,并且正在进行替代…但是,自Go发行以来,该段似乎没有太多更新。

它仍然是标记和扫描?是保守还是精确?它是世代相传的吗?


阅读 238

收藏
2020-07-02

共1个答案

一尘不染

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

  • 混合世界/并发收集器
  • 截止日期限制为10毫秒
  • 专门用于运行并发收集器的CPU内核
  • 三色标记扫掠算法
  • 非世代
  • 不紧凑的
  • 完全精确
  • 如果程序在四处移动指针,则会产生少量费用
  • 与Go 1.3 GC相比,延迟更短,但很可能吞吐量也更低

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

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

前往1.1垃圾收集器:

  • 标记扫描(并行实现)
  • 非世代
  • 不紧凑的
  • 最精确(堆叠框架除外)
  • 停止世界
  • 基于位图的表示
  • 程序不分配内存时的零成本(也就是说,改组指针的速度与C一样快,尽管实际上这比C的运行慢一些,因为Go编译器不如GCC这样的C编译器先进)
  • 支持对象的终结器
  • 不支持弱引用

去1.0垃圾收集器:

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

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

  • 除了非常大的堆之外,尚不清楚世代GC总体上是否会更快
  • 软件包“不安全”使得难以实施完全精确的GC和压缩GC
2020-07-02