移动垃圾收集器(例如分代收集器)会产生额外生成的代码,以便跨GC安全点存储和重新加载引用。与非移动收集器相比,有没有人量化过这种开销的性能成本?
我问,因为我有兴趣设计一个可以有效回收短期价值而无需移动它们的收集器。
答案 0 :(得分:6)
移动与不移动的权衡是一个复杂的权衡。我不知道你提到的方面的任何特定研究 - 事实上,我不确定我是否完全理解它:准确的GC总是需要知道所有指针的位置,所以也许你在谈论保守的不动GC?如果你对编译路径有足够的控制能够做出准确的GC,那么我认为保守的GC是一个糟糕的选择。
影响移动与非移动GC性能的其他方面是:
分配速度。非移动GC可能必须从空闲列表中分配,而coying GC可以使用bump-pointer分配。像Immix这样的混合方案试图在两者之间取得更好的权衡。
地点和缓存行为。关于移动和非移动GC的研究很多;见GC Bibliography。一般来说压缩对缓存有好处,虽然复制GC通常是广度优先的,这是一个不好的选择(访问模式往往是深度优先)所以在这个领域有一堆研究试图重新排列对象以匹配访问模式
我个人的观点是,为了支持真正的快速分配,你需要一个L2大小的托儿所,它有复制收集和凹凸指针分配。如果你做了其他任何事情,分配变得更加昂贵,这会扭曲很多事情:优化以减少分配变得更加重要,因此你最终会在那里花费精力并使事情变得更加复杂。我宁愿让分配真的很便宜,然后不用担心。