G1:mixed gc 和 full gc 有什么区别?

G1: What are the differences between mixed gc and full gc?

对于垃圾优先收集器,young gc 意味着仅在年轻代执行 gc,而 mixed gc 将同时清理年轻代和老年代。

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

我进行了一些搜索,但没有找到任何 post 可以解释 full gc

g1把heap分成region,young generation和old generation各有几个region。 一个年轻的 GC 收集了一些区域(不是全部),但是,所有这些区域都分配给了年轻一代。混合GC收集一些区域(不是全部),一些属于年轻代,至少有一个属于老年代。 Full GC 会收集所有区域,因此会收集年轻代和老年代。

在正常情况下,G1 应该只 运行 年轻和混合集合来满足其停顿时间目标。

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

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

来自 Oracle G1 GC blog and technetwork article

年轻的 GC:

Young GC 的集合集仅包含 young/survivor 个区域。

混合GC:

Mixed GC的收集集既包括young/survivor地区,也包括老地区。

巨大的对象和巨大的分配

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

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

为了减少复制开销,Humongous 对象不包括在任何疏散暂停中。 一个完整的垃圾回收周期将巨大的对象压缩到位。

通常 Full GC 会清理整个堆 – Young 和 Tenured 空间(老一代)

换句话说,无论 GC 类型如何,您都必须担心需要多少时间 "application threads were stopped":Young GC 或 Full GC 等