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 更多。