【发布时间】:2014-12-12 21:52:57
【问题描述】:
Go 1.3 实现了 precise 垃圾收集器。
它是如何精确识别指针的?
【问题讨论】:
标签: memory go garbage-collection
Go 1.3 实现了 precise 垃圾收集器。
它是如何精确识别指针的?
【问题讨论】:
标签: memory go garbage-collection
看着“Changes to the garbage collector”,机制似乎很简单:
从 Go 1.3 开始,运行时假定指针类型的值包含指针,而其他值不包含指针。
这个假设是堆栈扩展和垃圾收集的精确行为的基础。
使用 unsafe 包将整数存储为指针类型值的程序是非法的,如果运行时检测到该行为将崩溃。
使用 package unsafe 将指针存储为整数类型值的程序也是非法的,但在执行期间更难诊断。
此reddit thread 添加:
基本上,GC 必须找出哪些对象是可访问的,为此它必须跟随位于堆栈上的指针指向它们指向的每个对象,然后跟随对象中的指针指向它们指向的每个对象,直到它没有再遇到新对象。
GC 没有遇到的每个对象都是垃圾。问题在于它需要 GC 知道指针是什么:
- 精确的 GC 具有该信息,
- 保守的 GC 必须假定堆栈上的每个值都可能是一个指针,如果它与分配对象的地址相同。
因此,保守 GC 倾向于保留大量无法访问的对象,并且必须做更多的工作(遍历死对象图)。
【讨论】: