保守的垃圾回收(gc)可能比精确的垃圾回收更快 —— wingolog

主要观点:关于垃圾收集器应精确还是保守存在争议,普遍认为精确更好,但实际上保守的根查找可能导致更快的系统,有多个原因支持保守的垃圾收集。
关键信息:

  • 保守的垃圾收集指保守的根查找,假定栈上的整数为堆地址则表示引用,堆上对象精确追踪,可移动未被保守根引用的对象。
  • 精确根查找的编译器会输出指示栈帧中引用堆对象的槽位的边表,但这些寿命不一定精确,可能导致标记更多活对象。
  • 对于生成代码,栈图很好,但调用 C++等时需在运行时数据结构中精确追踪根,保守收集器可避免此开销。
  • 编译器分区栈上的溢出空间可能导致更大的栈大小,保守收集器可避免此问题。
  • 不需要发出栈图,追踪栈时更快速,测试栈上的字是否为堆指针更快。
  • 必须制作栈图对编译器是一种约束,保守编译器有时能有更好的代码生成。
  • 《Conservative Immix》论文表明保守栈扫描在某些情况下可击败精确扫描,Apple 的 JavaScriptCore 使用保守栈扫描,V8 也在考虑切换。
    重要细节:
  • 如在Conservative Immix中及parallel-stack-conservative-mmc 与 parallel-mmc 对比中都有相关结果。
  • Apple 的 JavaScriptCore 和 V8 对保守栈扫描的应用情况。
阅读 11
0 条评论