跳到主要内容

JEP 307:G1 的并行 Full GC

QWen Max 中英对照 JEP 307 Parallel Full GC for G1

概述

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

非目标

匹配并行收集器的完全垃圾回收在所有用例中的性能。

动机

G1 垃圾收集器在 JDK 9 中被设为默认值。之前的默认值并行收集器具有并行 Full GC。为了尽量减少经历 Full GC 的用户所受的影响,G1 Full GC 也应改为并行模式。

描述

G1 垃圾收集器旨在避免进行 Full GC,但如果并发收集无法足够快地回收内存,就会回退为执行 Full GC。当前 G1 中的 Full GC 实现使用的是单线程的标记-清除-压缩算法。我们计划将标记-清除-压缩算法并行化,并使用与 Young 和 Mixed 收集相同数量的线程。线程的数量可以通过 -XX:ParallelGCThreads 选项来控制,但这也会对用于 Young 和 Mixed 收集的线程数量产生影响。

测试

  • 全面的 GC 时间分析,以确保全面的 GC 次数有所改善。仅仅查看基准测试分数可能是不够的,因为 G1 的设计初衷就是避免全面 GC。

  • 使用 VTune 或 Solaris Studio 性能分析器进行运行时分析,以发现不必要的瓶颈。

风险与假设

  • 该工作基于一个假设,即 G1 的基本设计中没有任何内容能够阻止并行的完整 GC。

  • G1 使用区域(region)这一事实很可能会导致在并行完整 GC 之后比单线程的浪费更多的空间。