对于垃圾优先收集器,young gc 表示只在年轻代执行垃圾回收,mixed gc 会清理年轻代和老年代。
那么full gc是什么?为什么它的持续时间比mixed gc长?
我进行了一些搜索,但没有找到任何解释full gc的帖子。
对于垃圾优先收集器,young gc 表示只在年轻代执行垃圾回收,mixed gc 会清理年轻代和老年代。
那么full gc是什么?为什么它的持续时间比mixed gc长?
我进行了一些搜索,但没有找到任何解释full gc的帖子。
Young GC:
Young GC的集合仅包括年轻/幸存者区域。
Mixed GC:
Mixed GC的集合包括年轻/幸存者区域,也包括老年区域。
巨大对象和巨大分配
对于G1 GC,任何大于半个区域大小的对象都被视为“巨大对象”。这样的对象直接分配到老年代的“巨大区域”中。这些巨大区域是一组连续的区域。
死亡的巨大对象在标记周期结束时被释放,也在完整的垃圾回收周期内进行清理阶段。
为了减少复制开销,巨型对象不包含在任何疏散暂停中。完整的垃圾回收周期会就地压缩巨型对象。 通常情况下,Full GC 会清理整个堆 - 包括年轻代和旧生代(老年代) 另外,无论是 Young GC 还是 Full GC 等,都要关注“应用程序线程停止”的时间。g1将堆分成多个区域,其中年轻代和老年代各由多个区域组成。 年轻代GC只收集一些区域(不是全部),但所有这些区域都分配给年轻代。混合GC收集一些区域(不是全部),其中有些属于年轻代,至少有一个属于老年代。完全GC收集所有区域,因此包括年轻代和老年代。
在正常情况下,G1只应运行年轻代和混合收集以满足其暂停时间目标。
Full GC是一种后备机制,很可能违反这些目标。当混合GC无法跟上分配时,当无法满足巨大的分配或请求使用System.gc()
和其他条件时,它们会发生。
使用-XX:+PrintGCDetails
记录日志应包括完整收集的原因。
年轻代GC和混合GC的区别:
来自Oracle文档: https://docs.oracle.com/en/java/javase/11/gctuning/garbage-first-g1-garbage-collector1.html
自适应IHOP尝试设置初始堆占用率,使空间回收阶段的第一次混合垃圾收集在老年代占用率处于当前最大老年代大小减去-XX:G1HeapReservePercent的值作为额外缓冲区时启动。
对于完整GC:
Full GC 发生的原因是应用程序分配了太多无法快速回收的对象。通常,并发标记未能及时完成,以便开始空间回收阶段。在空间回收之后,收集周期会重新开始另一个仅年轻代的阶段。作为备份,如果应用程序在收集存活信息时耗尽内存,则像其他收集器一样,G1执行原地停止全堆压缩(Full GC)。
通常情况下Full GC会清理整个堆
回答了我的问题。谢谢! - Neo