Go 1.3实现了一个precise垃圾收集器。
如何准确识别指针?
答案 0 :(得分:5)
看着" Changes to the garbage collector",机制似乎很简单:
从Go 1.3开始,运行时假定指针类型的值包含指针而其他值不。
这个假设对于堆栈扩展和垃圾收集的精确行为至关重要。
使用包unsafe在指针类型值中存储整数的程序是非法的,如果运行时检测到该行为,则会崩溃。
使用包unsafe以整数类型值存储指针的程序也是非法的,但在执行期间更难以诊断。
此reddit thread添加:
基本上GC必须找出哪些对象是可到达的,为此,它必须跟随堆栈上的指针指向它们指向的每个对象,然后按照对象中的指针指向它们指向的每个对象,直到它为止更长时间遇到新物体 GC没有遇到的每个对象都是垃圾。
问题在于它需要GC知道指针是什么:
- 精确的GC有这方面的信息,
- 保守的GC必须假设如果堆栈上的每个值与分配的对象的地址相同,则它可能是指针。
因此,保护GCs倾向于保留大量无法到达的对象并且必须做更多的工作(遍历死对象图)。