JavaG1:混合gc和完全gc之间有什么区别?
对于垃圾第一收集器,young gc意味着只在年轻一代执行gc,mixed gc将清除年轻一代和老一代
那么什么是完整gc?为什么它比混合gc持续时间更长
我做了一些搜索,但没有找到任何解释完整gc的帖子
你可以在下面搜索框中键入要查询的问题!
对于垃圾第一收集器,young gc意味着只在年轻一代执行gc,mixed gc将清除年轻一代和老一代
那么什么是完整gc?为什么它比混合gc持续时间更长
我做了一些搜索,但没有找到任何解释完整gc的帖子
# 1 楼答案
从甲骨文G1 GC blog和technetwork article
年轻GC:
年轻GC的集合集仅包括年轻/幸存者区域
混合GC:
混合GC的集合集既包括年轻/幸存区域,也包括老年区域
庞大的对象和庞大的分配
对于G1 GC,任何超过区域大小一半的对象都被视为“巨大对象”。这样一个对象在老一代中直接分配到“巨大区域s”<这些巨大的区域是一组连续的区域
在清理阶段的标记周期结束时,以及在整个垃圾收集周期中,将释放死掉的大量对象
为了减少复制开销,在任何疏散暂停中都不包括庞大的对象一个完整的垃圾收集周期将大量对象压缩到位
通常,完整GC清理整个堆–年轻空间和终身空间(老一代)
另一方面,您必须担心“应用程序线程停止”的时间,而不管GC类型:年轻GC或完整GC等
# 2 楼答案
在正常情况下,G1应该只运行年轻的和混合的集合,以满足其暂停时间目标
全面地面军事系统是一种后备机制,可能会违反这些目标。当混合GC无法跟上分配时,当庞大的分配无法满足时,或当GC被
System.gc()
和其他一些条件请求时,就会发生这种情况使用
-XX:+PrintGCDetails
进行日志记录应包括完整收集的原因# 3 楼答案
g1将堆划分为多个区域,其中年轻一代和老一代分别由多个区域组成。 年轻的GC收集一些区域(不是全部),但是,所有区域都分配给年轻的一代。混合GC收集一些区域(不是全部),一些属于年轻一代,至少一个属于老一代。一个完整的GC收集所有区域,并因此收集年轻人和老年人