Go 1.3 实现了一个精确的垃圾收集器。它如何精确识别指针?
1 回答
喵喔喔
TA贡献1735条经验 获得超5个赞
查看“对垃圾收集器的更改”,其机制似乎很简单:
从 Go 1.3 开始,运行时假定指针类型的值包含指针,而其他值不包含。
这个假设是堆栈扩展和垃圾收集的精确行为的基础。
使用包 unsafe 将整数存储在指针类型值中的程序是非法的,如果运行时检测到该行为,将会崩溃。
使用包 unsafe 将指针存储在整数类型值中的程序也是非法的,但在执行过程中更难诊断。
这个reddit线程添加:
基本上,GC 必须找出哪些对象是可访问的,为此它必须遵循堆栈上的指针指向它们指向的每个对象,然后遵循对象中的指针指向它们指向的每个对象,直到不再遇到新对象对象。
GC 没有遇到的每个对象都是垃圾。问题在于它需要 GC 知道什么是指针:
一个精确的 GC 有这些信息,
保守的 GC 必须假设堆栈上的每个值都可能是一个指针,如果它与分配对象的地址相同。
因此,conservate GC 往往会保留许多无法访问的对象,并且必须做更多的工作(遍历死对象图)。
- 1 回答
- 0 关注
- 201 浏览
添加回答
举报
0/150
提交
取消