jvm旧gc将标记所有堆还是仅标记旧堆?因为年轻的一代 对象可以包含旧的对象。
答案 0 :(得分:0)
这取决于您使用的收集器。
一些收集者没有使用任何结构来记录从年轻一代到老一代的引用。从理论上讲,这些收集者必须扫描年轻一代才能找到垃圾。但是,某些收集器将执行次要gc而不是扫描年轻一代。像CMS(并发标记扫描)一样,它将扫描年轻一代。但是您可以使用选项
-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark
在进行完整的gc或CMS备注阶段之前收集年轻一代。
但是有些收藏家不需要扫描年轻一代。他们通常使用一些数据结构来记录引用,例如G1(垃圾优先)收集器。它使用RS(记住设置)。 G1收集器将扫描RS以找到参考。例如,如果有一个年轻区域调用yr1,则在旧区域or1中有一个指向对象的参考点。 RS将添加如下记录:
yr1 -> or1
(RS的实际实现非常复杂) 因此,在标记周期中,G1将扫描RS以找出所有指向or1的参考点。
更多细节: