跳到主要内容

JEP 307:G1 的并行完整 GC

概括

通过使完整 GC 并行来改善 G1 最坏情况下的延迟。

非目标

与所有用例的并行收集器完整 GC 的性能相匹配。

动机

G1 垃圾收集器在 JDK 9 中成为默认收集器。之前的默认收集器(并行收集器)具有并行完整 GC。为了最大限度地减少对经历 Full GC 的用户的影响,G1 full GC 也应该是并行的。

描述

G1 垃圾收集器旨在避免完全收集,但当并发收集无法足够快地回收内存时,将发生回退完全 GC。 G1 的完整 GC 当前实现使用单线程标记-清除-紧凑算法。我们打算并行化标记-清除-紧凑算法,并使用与 Young 和 Mixed 集合相同数量的线程。线程的数量可以通过该-XX:ParallelGCThreads选项来控制,但这也会影响用于Young和Mixed集合的线程数量。

测试

  • 完整GC时间分析以确保完整GC时间有所改善。查看基准测试分数可能不够好,因为 G1 旨在避免完整的 GC。

  • 使用 VTune 或 Solaris Studio Performance Analyzer 进行运行时分析以查找不必要的瓶颈。

风险和假设

  • 这项工作基于这样的假设:G1 的基本设计中没有任何内容可以阻止并行完整 GC。

  • 事实上,G1 使用区域很可能会导致并行完整 GC 后比单线程GC 浪费更多空间。