G1:混合gc和完整gc有什么区别?

时间:2016-02-13 13:58:51

标签: java garbage-collection jvm g1gc

对于垃圾第一收集器, young gc 表示仅在年轻一代中执行gc,混合gc 将清除年轻一代和老一代。

那么什么是完整的gc ?为什么它持续时间超过混合gc

我已经做了一些搜索,但我找不到任何解释完整gc 的帖子。

3 个答案:

答案 0 :(得分:6)

来自Oracle G1 GC blogtechnetwork article

年轻的GC:

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

混合GC:

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

Humongous Objects和Humongous Allocations

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

在整个垃圾收集周期中,在清理阶段,在标记周期结束时释放

为了减少复制开销,Humongous对象不包含在任何疏散暂停中。 完整的垃圾收集周期可以压缩Humongous对象。

通常完整GC 会清除整个堆 - 年轻和终身空间(旧版)

另一方面,无论GC类型如何,您都必须担心“应用程序线程被停止”的时间:Young GC或Full GC等。

答案 1 :(得分:3)

g1将堆分成区域,其中年轻一代和老一代各自由几个区域组成。 一个年轻的GC会收集一些地区(并非所有地区),然而,所有地区都分配给年轻一代。混合GC收集一些区域(不是全部),一些属于年轻一代,至少一个属于老一代。完整的GC收集所有地区,因此,年轻和老一代。

答案 2 :(得分:1)

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

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

使用-XX:+PrintGCDetails进行记录应该包含完整集合的原因。