10

对于垃圾优先收集器,年轻 gc意味着仅在年轻代中执行 gc, 混合 gc 将清理年轻代和老年代。

那么什么是完整的 gc呢?为什么它比混合 gc持续时间更长?

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

4

3 回答 3

8

来自 Oracle G1 GC 博客technetwork 文章

年轻的GC:

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

混合GC:

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

庞大的对象和庞大的分配

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

Dead Humongous 对象在清理阶段的标记周期结束时被释放,也是在完整的垃圾回收周期中。

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

一般来说,Full GC会清理整个堆——包括年轻空间和 Tenured 空间(老一代)

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

于 2016-02-13T15:35:54.510 回答
4

g1 将堆划分为多个区域,其中年轻代和老年代分别由几个区域组成。年轻的 GC 收集一些区域(不是全部),但是,它们都分配给年轻代。混合 GC 收集一些区域(不是全部),一些属于年轻代,至少一个属于老年代。完整的 GC 会收集所有区域,因此会收集年轻代和年老代。

于 2016-02-13T15:06:04.277 回答
2

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

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

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

于 2016-02-13T15:23:23.210 回答