G1: 混合垃圾回收和完全垃圾回收有什么区别?

11

对于垃圾优先收集器,young gc 表示只在年轻代执行垃圾回收,mixed gc 会清理年轻代和老年代。

那么full gc是什么?为什么它的持续时间比mixed gc长?

我进行了一些搜索,但没有找到任何解释full gc的帖子。

4个回答

7

来自Oracle G1 GC博客技术网络文章

Young GC:

Young GC的集合仅包括年轻/幸存者区域。

Mixed GC:

Mixed GC的集合包括年轻/幸存者区域,也包括老年区域。

巨大对象和巨大分配

对于G1 GC,任何大于半个区域大小的对象都被视为“巨大对象”。这样的对象直接分配到老年代的“巨大区域”中。这些巨大区域是一组连续的区域。

死亡的巨大对象在标记周期结束时被释放,也在完整的垃圾回收周期内进行清理阶段。

为了减少复制开销,巨型对象不包含在任何疏散暂停中。完整的垃圾回收周期会就地压缩巨型对象。 通常情况下,Full GC 会清理整个堆 - 包括年轻代和旧生代(老年代) 另外,无论是 Young GC 还是 Full GC 等,都要关注“应用程序线程停止”的时间。

事实上我已经读了这篇文章。通常情况下Full GC会清理整个堆回答了我的问题。谢谢! - Neo
还有一个问题:G1在执行完整GC时会使用什么算法?完整GC之所以慢得多,是因为它清理了所有区域吗? - Neo
Full GCs:目前G1的Full GC是单线程的,非常缓慢,我们应该尽可能避免Full GC。 - Ravindra babu
JVM 在进行巨型内存分配时是否会打印日志? - Erben Mo

4

g1将堆分成多个区域,其中年轻代和老年代各由多个区域组成。 年轻代GC只收集一些区域(不是全部),但所有这些区域都分配给年轻代。混合GC收集一些区域(不是全部),其中有些属于年轻代,至少有一个属于老年代。完全GC收集所有区域,因此包括年轻代和老年代。


2

在正常情况下,G1只应运行年轻代和混合收集以满足其暂停时间目标。

Full GC是一种后备机制,很可能违反这些目标。当混合GC无法跟上分配时,当无法满足巨大的分配或请求使用System.gc()和其他条件时,它们会发生。

使用-XX:+PrintGCDetails记录日志应包括完整收集的原因。


0

年轻代GC和混合GC的区别:

  • 混合GC包括旧区域回收(默认情况下为旧区域的1/8)。
  • 当IHOP达到时,将触发混合GC。 (默认情况下当老年代占比> 45%时触发。)

来自Oracle文档: https://docs.oracle.com/en/java/javase/11/gctuning/garbage-first-g1-garbage-collector1.html

自适应IHOP尝试设置初始堆占用率,使空间回收阶段的第一次混合垃圾收集在老年代占用率处于当前最大老年代大小减去-XX:G1HeapReservePercent的值作为额外缓冲区时启动。

对于完整GC:

在空间回收之后,收集周期会重新开始另一个仅年轻代的阶段。作为备份,如果应用程序在收集存活信息时耗尽内存,则像其他收集器一样,G1执行原地停止全堆压缩(Full GC)。

Full GC 发生的原因是应用程序分配了太多无法快速回收的对象。通常,并发标记未能及时完成,以便开始空间回收阶段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接