java垃圾收集年轻一代扫描
我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧
我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物
你可以在下面搜索框中键入要查询的问题!
我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧
我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物
# 1 楼答案
当GC在年轻一代中运行时,它被称为小集合。旧一代的对象与这种类型的集合无关
是的,可以从根直接访问的对象被标记为活动对象,但它们可以位于堆的其他位置,因此它们可以是旧一代的对象
即使可以访问Old Gen对象,次要收集也不会回收Old Gen中的垃圾
引用HotSpot doc
对我来说,这意味着GC将遍历对象图,可能会在OldGen中找到垃圾,但不会回收垃圾
我发现这个IBM article很好地解释了代际引用跟踪在热点GC中的工作原理
# 2 楼答案
虽然我没有直接检查过这一点,但根据常识,每次遇到旧一代的对象时,对象图遍历都会被缩减。注意,这种检查非常便宜:对指针值进行简单的范围检查就足以确定对象在堆区域中的位置
还有一个重要的问题要考虑:如果一个年轻的物体只能通过一个旧物体来实现呢?显然,老一代必须以某种方式被视为进入卡片表:这是每个堆区域前面的一个备份结构,其中保存了该区域的压缩“位图”视图,这样每个位对应于256字节的堆。每次更新引用类型的变量时,卡片表中相应的位都被提升为1,表示“脏”
卡片表就位后,每个YG集合都会发生以下情况:扫描所有标记为“脏”的堆块,寻找指向年轻一代中对象的指针。通过这种方式找到的每个对象都被认为是可到达的
上面的一个例子:通过一个旧对象可以访问的年轻对象,而这个旧对象同时变成了垃圾,将被认为是可以访问的,并且会污染堆,直到一个主要的GC发生