【问题标题】:How does Go's precise GC work?Go 的精确 GC 是如何工作的?
【发布时间】:2014-12-12 21:52:57
【问题描述】:

Go 1.3 实现了 precise 垃圾收集器。

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

【问题讨论】:

    标签: memory go garbage-collection


    【解决方案1】:

    看着“Changes to the garbage collector”,机制似乎很简单:

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

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

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

    reddit thread 添加:

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

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

    • 精确的 GC 具有该信息,
    • 保守的 GC 必须假定堆栈上的每个值都可能是一个指针,如果它与分配对象的地址相同。

    因此,保守 GC 倾向于保留大量无法访问的对象,并且必须做更多的工作(遍历死对象图)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-26
      • 2017-06-13
      • 2011-02-12
      • 2011-02-22
      • 2015-12-08
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多