Go 使用什么样的垃圾回收? [英] What kind of Garbage Collection does Go use?

查看:34
本文介绍了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.1 之上的 Go 1.3 垃圾收集器更新:

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 替换 GC 是有争议的,例如:

Replacing the GC with a different one is controversial, for example:

  • 除了非常大的堆外,目前尚不清楚分代 GC 是否总体上会更快
  • 包不安全"使得实现完全精确的 GC 和压缩 GC 变得困难

这篇关于Go 使用什么样的垃圾回收?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆