对于垃圾优先收集器,年轻 gc意味着仅在年轻代中执行 gc, 混合 gc 将清理年轻代和老年代。
那么什么是完整的 gc呢?为什么它比混合 gc持续时间更长?
我进行了一些搜索,但没有找到任何解释完整 gc的帖子。
对于垃圾优先收集器,年轻 gc意味着仅在年轻代中执行 gc, 混合 gc 将清理年轻代和老年代。
那么什么是完整的 gc呢?为什么它比混合 gc持续时间更长?
我进行了一些搜索,但没有找到任何解释完整 gc的帖子。
来自 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 等。
g1 将堆划分为多个区域,其中年轻代和老年代分别由几个区域组成。年轻的 GC 收集一些区域(不是全部),但是,它们都分配给年轻代。混合 GC 收集一些区域(不是全部),一些属于年轻代,至少一个属于老年代。完整的 GC 会收集所有区域,因此会收集年轻代和年老代。
在正常情况下,G1 应该只运行年轻和混合收集来满足其暂停时间目标。
Full GC 是一种后备机制,可能会违反这些目标。它们发生在混合 GC 无法跟上分配、无法满足巨大分配或请求 GCSystem.gc()
以及其他一些条件时。
记录-XX:+PrintGCDetails
应该包括完整收集的原因。