为了账号安全,请及时绑定邮箱和手机立即绑定

Go 的精确 GC 是如何工作的?

Go 的精确 GC 是如何工作的?

Go
扬帆大鱼 2021-08-23 16:39:38
Go 1.3 实现了一个精确的垃圾收集器。它如何精确识别指针?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

查看“对垃圾收集器的更改”,其机制似乎很简单:

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

这个假设是堆栈扩展和垃圾收集的精确行为的基础。

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

这个reddit线程添加:

基本上,GC 必须找出哪些对象是可访问的,为此它必须遵循堆栈上的指针指向它们指向的每个对象,然后遵循对象中的指针指向它们指向的每个对象,直到不再遇到新对象对象。
GC 没有遇到的每个对象都是垃圾。

问题在于它需要 GC 知道什么是指针:

  • 一个精确的 GC 有这些信息,

  • 保守的 GC 必须假设堆栈上的每个值都可能是一个指针,如果它与分配对象的地址相同。

因此,conservate GC 往往会保留许多无法访问的对象,并且必须做更多的工作(遍历死对象图)。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信