【发布时间】:2016-02-13 13:58:51
【问题描述】:
对于垃圾优先收集器,young gc 表示仅在年轻代中执行 gc,mixed gc 将同时清理年轻代和老年代。
那么什么是full gc?为什么它比混合 gc 持续时间更长?
我进行了一些搜索,但没有找到任何解释 full gc 的帖子。
【问题讨论】:
标签: java garbage-collection jvm g1gc
对于垃圾优先收集器,young gc 表示仅在年轻代中执行 gc,mixed gc 将同时清理年轻代和老年代。
那么什么是full gc?为什么它比混合 gc 持续时间更长?
我进行了一些搜索,但没有找到任何解释 full gc 的帖子。
【问题讨论】:
标签: java garbage-collection jvm g1gc
来自 Oracle G1 GC blog 和 technetwork article
年轻的 GC:
Young GC的收集集只包含young/survivor区域。
混合 GC:
混合 GC 的收集集既包括年轻/幸存者区域,也包括老区域。
巨大的对象和巨大的分配
对于 G1 GC,任何超过一半区域大小的对象都被视为“巨大的对象”。这样的对象直接在老年代分配到“Humongous regions”中。 这些 Humongous 区域是一组连续的区域。
Dead Humongous 对象在清理阶段结束时被释放,在整个垃圾回收周期期间也是如此。
为了减少复制开销,Humongous 对象不包含在任何撤离暂停中。 一个完整的垃圾回收周期将 Humongous 对象压缩到位。
Full GC 通常会清理整个堆 - Young 和 Tenured 空间(老一代)
另一方面,无论 GC 类型如何,您都必须担心“应用程序线程停止”的时间:年轻 GC 或 Full GC 等。
【讨论】:
Generally Full GC cleans entire Heap 回答我的问题。谢谢!
g1 将堆划分为多个区域,其中年轻代和老年代分别由多个区域组成。 年轻的 GC 收集一些区域(不是全部),但是,它们都分配给年轻代。混合 GC 收集一些区域(不是全部),一些属于年轻代,至少一个属于老年代。完整的 GC 会收集所有区域,从而收集年轻代和年老代。
【讨论】:
在正常情况下,G1 应该只运行年轻和混合收集来满足其暂停时间目标。
Full GC 是一种后备机制,可能会违反这些目标。它们发生在混合 GC 无法跟上分配的速度、无法满足巨大分配或使用 System.gc() 和其他一些条件请求 GC 时。
使用-XX:+PrintGCDetails 进行日志记录应包含完整收集的原因。
【讨论】: