跳到主要内容

JEP 344:G1 可中止的混合集合

概括

如果 G1 混合收集可能超出暂停目标,则使它们可中止。

非目标

使 G1 中的所有暂停都可中止。

动机

G1 的目标之一是满足用户为其收集暂停提供的暂停时间目标。 G1 使用高级分析引擎来选择收集期间要完成的工作量(这部分基于应用程序行为)。此选择的结果是一组称为_集合集_的区域。一旦确定了收集集并开始收集,G1 必须不间断地收集收集集所有区域中的所有存活对象。如果启发式方法选择太大的收集集,则此行为可能会导致 G1 超出暂停时间目标,例如,如果应用程序的行为发生变化,导致启发式方法处理“陈旧”数据,则可能会发生这种情况。在混合收集期间尤其可以观察到这一点,其中收集集通常包含太多旧区域。需要一种机制来检测启发式何时重复选择错误的收集工作量,如果是这样,则让 G1 逐步执行收集工作,其中可以在每个步骤后中止收集。这样的机制将允许 G1 更频繁地满足暂停时间目标。

描述

如果 G1 发现收集集选择启发式重复选择错误数量的区域,请切换到更增量的混合收集方式:将收集集分为两部分,强制部分和可选部分。强制部分包括收集集中 G1 无法增量处理的部分(例如年轻区域),但也可以包含旧区域以提高效率。例如,这可以是预测收集集的80%。预测收集集的剩余 20%(仅包含旧区域)形成可选部分。

在 G1 完成强制部分的收集后,如果还有时间,G1 会开始以更细粒度的级别收集可选部分。该可选部分的收集粒度取决于剩余时间量,最多一次收集一个区域。在完成可选收集集合的任意部分的收集后,G1可以根据剩余时间决定停止收集。

随着预测再次变得更加准确,集合的可选部分变得越来越小,直到强制部分再次包含所有集合集(即,G1 完全依赖于其启发式)。如果预测再次变得不准确,那么下一个集合将再次包含强制部分和可选部分。

备择方案

  • 改进分析引擎和启发式方法,这样他们就不会做出错误的预测。尽管这本身就是一个有趣的目标,但考虑到启发法取决于以前的应用程序行为,因此不可能获得 100% 准确的启发法。然而,改进的启发式方法将自动减少对此机制的需求。

  • 始终使用关于预测的“安全裕度”。例如,如果预测返回_x_,则始终使用 0.8 * x(20% 的安全裕度)。这可能在大多数情况下有效,但当预测有效时会导致性能次优,因为这意味着 G1 只会利用 80% 的暂停目标。

  • 重用现有的疏散失败机制来中止混合收集。这已被拒绝作为替代方案,因为在此类中止时,不能保证集合释放任何区域。我们提出的机制通过以区域为基础回收集合集的空间来保证空间回收进度,这就是G1的空间回收粒度。

测试

构成实现的各个 C++ 部分应使用 C++ 单元测试进行测试。由于可中止的混合收集代码将是 G1 GC 的组成部分,因此只需运行现有测试即可执行该代码。

风险和假设

  • 当将收集集拆分为强制部分和可选部分时,需要为可选收集集部分维护一些额外的数据。这会产生轻微的 CPU 开销,小于 1%,并且仅适用于使用可选收集集部分的混合收集。

  • 使用可选收集集部分的混合收集期间的本机内存使用量也可能会增加。这是因为在混合收集期间必须跟踪可选部分中区域的一些附加传入指针。