主要观点:关于垃圾收集器应精确还是保守存在争议,普遍认为精确更好,但实际上保守的根查找可能导致更快的系统,有多个原因支持保守的垃圾收集。
关键信息:
- 保守的垃圾收集指保守的根查找,假定栈上的整数为堆地址则表示引用,堆上对象精确追踪,可移动未被保守根引用的对象。
- 精确根查找的编译器会输出指示栈帧中引用堆对象的槽位的边表,但这些寿命不一定精确,可能导致标记更多活对象。
- 对于生成代码,栈图很好,但调用 C++等时需在运行时数据结构中精确追踪根,保守收集器可避免此开销。
- 编译器分区栈上的溢出空间可能导致更大的栈大小,保守收集器可避免此问题。
- 不需要发出栈图,追踪栈时更快速,测试栈上的字是否为堆指针更快。
- 必须制作栈图对编译器是一种约束,保守编译器有时能有更好的代码生成。
- 《Conservative Immix》论文表明保守栈扫描在某些情况下可击败精确扫描,Apple 的 JavaScriptCore 使用保守栈扫描,V8 也在考虑切换。
重要细节: - 如在Conservative Immix中及parallel-stack-conservative-mmc 与 parallel-mmc 对比中都有相关结果。
- Apple 的 JavaScriptCore 和 V8 对保守栈扫描的应用情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。