Go语言的精确垃圾回收机制是如何工作的?

3

Go 1.3实现了一种精确垃圾收集器。

它是如何精确地识别指针的?

1个回答

5

看 "垃圾回收器的更改",机制似乎很简单:

从 Go 1.3 开始,运行时假设具有指针类型的值包含指针,而其他值则不包含

这种假设对于堆栈扩展和垃圾回收的精确行为至关重要。

使用 package unsafe 将整数存储在指针类型值中的程序是非法的,如果运行时检测到这种行为,则会崩溃。
使用 package unsafe 将指针存储在整数类型值中的程序也是非法的,但在执行期间更难诊断。

这个 reddit 帖子 补充道:

基本上,垃圾回收器必须找出哪些对象是可达的,为此它必须沿着栈上的指针跟踪到它们指向的每个对象,然后在对象中跟踪指针以访问它们指向的每个对象,直到不再遇到新的对象为止。GC没有遇到的每个对象都是垃圾。
问题在于,这需要GC知道指针是什么:
  • 精确GC具有该信息,
  • 保守GC必须假设栈上的每个值都可能是指针,如果它与分配对象的地址相同。
因此,保守GC倾向于保留大量不可达的对象,并且必须执行更多的工作(遍历死亡对象图)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接