Go的精确GC如何工作?

时间:2014-10-17 10:19:58

标签: memory go garbage-collection

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

如何准确识别指针?

1 个答案:

答案 0 :(得分:5)

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

  

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

     

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

     

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

reddit thread添加:

  

基本上GC必须找出哪些对象是可到达的,为此,它必须跟随堆栈上的指针指向它们指向的每个对象,然后按照对象中的指针指向它们指向的每个对象,直到它为止更长时间遇到新物体   GC没有遇到的每个对象都是垃圾。

     

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

     
      
  • 精确的GC有这方面的信息,
  •   
  • 保守的GC必须假设如果堆栈上的每个值与分配的对象的地址相同,则它可能是指针。
  •   
     

因此,保护​​GCs倾向于保留大量无法到达的对象并且必须做更多的工作(遍历死对象图)。