一篇关于一种新型垃圾收集算法——Mark-Scavenge的文章。这篇文章总结了Mark-Scavenge算法的主要特点,它是由Oracle和乌普萨拉大学的最新研究合作中提出的。文章讨论了在移动垃圾收集器中使用可达性作为活性的代理会导致不必要的数据移动,以及如何解决这个问题。
现代垃圾收集假设弱代际假设成立,即大多数对象都是短命的。堆被划分为不同年龄的区域。在年轻代中,一个针对活动对象的垃圾收集算法会比针对垃圾对象的算法更有效,因为活动对象的数量会显著少于垃圾对象。
垃圾收集器通常使用指针可达性来近似活性,但这可能导致“浪费的工作”,即移动那些虽然可达但实际上再也不会被系统触及的对象。
OpenJDK中的所有垃圾收集器都使用可达性作为活性的近似。例如,
- Serial和G1在scavenging(清除)的上下文中这样做。
- ZGC使用单独的Mark和Evacuate阶段来发现和复制对象。
Mark-Scavenge算法:
本文提出一种新的垃圾收集算法,它通过延迟清除直到下一个垃圾收集周期来减少浪费的工作,增加对象变得不可达的机会。
这种算法结合了Scavenging和Mark-Evacuate的优点:选择性地清除和在发现后立即清除,这是Mark-Scavenge的新特点。
通过在ZGC中实现Mark-Scavenge,文章展示了这种算法如何显著减少浪费的工作。在某些情况下,它减少了高达91%的死亡对象的重新定位。
在负载较重的机器上,这种减少垃圾数据复制的方法对性能有积极影响,特别是在延迟和吞吐量方面。
我们的结果表明,将活跃度与可达性等同起来会导致移动收集器中大量复制垃圾数据。在负载很重的机器上,这会对性能产生负面影响,正如我们在 ZGC 中的Mark-Scavenge实现所证明的那样。这项工作的见解将使垃圾收集工程师和研究人员能够进一步改进最先进的技术。