jvm old gc将标记所有堆还是仅标记olld堆?

时间:2019-01-21 02:58:23

标签: garbage-collection jvm

jvm旧gc将标记所有堆还是仅标记旧堆?因为年轻的一代  对象可以包含旧的对象。

1 个答案:

答案 0 :(得分:0)

这取决于您使用的收集器。

一些收集者没有使用任何结构来记录从年轻一代到老一代的引用。从理论上讲,这些收集者必须扫描年轻一代才能找到垃圾。但是,某些收集器将执行次要gc而不是扫描年轻一代。像CMS(并发标记扫描)一样,它将扫描年轻一代。但是您可以使用选项

-XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark 

在进行完整的gc或CMS备注阶段之前收集年轻一代。

但是有些收藏家不需要扫描年轻一代。他们通常使用一些数据结构来记录引用,例如G1(垃圾优先)收集器。它使用RS(记住设置)。 G1收集器将扫描RS以找到参考。例如,如果有一个年轻区域调用yr1,则在旧区域or1中有一个指向对象的参考点。 RS将添加如下记录:

yr1 -> or1

(RS的实际实现非常复杂) 因此,在标记周期中,G1将扫描RS以找出所有指向or1的参考点。

更多细节: