Go 1.3实现了一种精确垃圾收集器。
它是如何精确地识别指针的?
看 "垃圾回收器的更改",机制似乎很简单:
从 Go 1.3 开始,运行时假设具有指针类型的值包含指针,而其他值则不包含。
这种假设对于堆栈扩展和垃圾回收的精确行为至关重要。
使用 package unsafe 将整数存储在指针类型值中的程序是非法的,如果运行时检测到这种行为,则会崩溃。
使用 package unsafe 将指针存储在整数类型值中的程序也是非法的,但在执行期间更难诊断。
这个 reddit 帖子 补充道:
基本上,垃圾回收器必须找出哪些对象是可达的,为此它必须沿着栈上的指针跟踪到它们指向的每个对象,然后在对象中跟踪指针以访问它们指向的每个对象,直到不再遇到新的对象为止。GC没有遇到的每个对象都是垃圾。