需要解释的关于G1的并行全GC

2022-09-03 12:39:59

作为java的一部分,JDK10 JEP307是G1 realsed的Parallel Full GC

我试图掌握它的描述,但我仍然不相信我是否正确理解了这个想法。

我怀疑它是否与并发垃圾有关


答案 1

作为简化的解释 - 垃圾回收器有两种可能的收集类型,“增量”和“完整”。增量收集是两者中更好的一种,因为它会经常做一些工作。完全收集通常更具破坏性,因为它需要更长的时间,并且通常必须在运行时停止整个程序的执行。

因此,大多数现代GC(包括G1)通常会尝试确保在正常情况下,增量收集就足够了,并且永远不需要完整的集合。但是,如果不同代系的大量对象以不可预测的方式符合垃圾回收的条件,则有时完整的GC可能是不可避免的。

目前,G1 全集合实现只有单线程。这就是JEP的用武之地 - 它旨在并行化它,这样当一个完整的GC确实发生时,它在可以支持并行执行的系统上会更快。


答案 2

最后,我了解了G1的并行全GC

enter image description here

在 JDK 9 中成为默认值,并在 JDK 7 中引入

高效并发处理堆在完全垃圾回收上失败有时完全垃圾回收是不可避免的。它有效地同时处理非常大的堆 正常GC会将堆分成年轻(伊甸园和幸存者)和老一代(逻辑分离)G1将堆分成许多小区域。这种拆分使G1能够选择一个小区域来收集并快速完成。

在 JDK9 中,使用单线程进行完整 GC

在JDK 10中使用多线程(并行)进行垃圾回收