Skip to content

JEP 307: Parallel Full GC for G1 | G1 的并行 Full GC

摘要

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

非目标

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

动机

G1 垃圾收集器在 JDK 9 中成为默认值。之前的默认值并行收集器具有并行完全 GC。为了最大限度地减少对用户进行完全 GC 的影响,G1 完全 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 更多。