本文介绍了Go 使用什么样的垃圾收集器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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 使用什么样的垃圾收集器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 05:36