对于垃圾第一收集器, young gc 表示仅在年轻一代中执行gc,混合gc 将清除年轻一代和老一代。
那么什么是完整的gc ?为什么它持续时间超过混合gc ?
我已经做了一些搜索,但我找不到任何解释完整gc 的帖子。
答案 0 :(得分:6)
来自Oracle G1 GC blog和technetwork 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
进行记录应该包含完整集合的原因。