有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java垃圾收集年轻一代扫描

我在尝试理解垃圾收集机制,我在研究代际算法,我有一个关于年轻人和老年人的代沟的问题。我读到,在年轻一代开始收集物品,GC是从GC根开始标记它们,以找到活的,通常它会将它们复制到幸存者空间,清除年轻一代区域,然后瞧

我不明白,如果我们从GC根开始,我们开始遍历活动对象,我们不是也在旧一代中找到了对象吗?这是否意味着,当我们击中旧空间中的一个物体时,我们会在那个点上停止跟踪参照物


共 (2) 个答案

  1. # 1 楼答案

    当GC在年轻一代中运行时,它被称为小集合。旧一代的对象与这种类型的集合无关

    是的,可以从根直接访问的对象被标记为活动对象,但它们可以位于堆的其他位置,因此它们可以是旧一代的对象

    即使可以访问Old Gen对象,次要收集也不会回收Old Gen中的垃圾

    引用HotSpot doc

    When the young generation fills up it causes a minor collection in which only the young generation is collected; garbage in other generations is not reclaimed

    对我来说,这意味着GC将遍历对象图,可能会在OldGen中找到垃圾,但不会回收垃圾

    我发现这个IBM article很好地解释了代际引用跟踪在热点GC中的工作原理

  2. # 2 楼答案

    虽然我没有直接检查过这一点,但根据常识,每次遇到旧一代的对象时,对象图遍历都会被缩减。注意,这种检查非常便宜:对指针值进行简单的范围检查就足以确定对象在堆区域中的位置

    还有一个重要的问题要考虑:如果一个年轻的物体只能通过一个旧物体来实现呢?显然,老一代必须以某种方式被视为

    进入卡片表:这是每个堆区域前面的一个备份结构,其中保存了该区域的压缩“位图”视图,这样每个位对应于256字节的堆。每次更新引用类型的变量时,卡片表中相应的位都被提升为1,表示“脏”

    卡片表就位后,每个YG集合都会发生以下情况:扫描所有标记为“脏”的堆块,寻找指向年轻一代中对象的指针。通过这种方式找到的每个对象都被认为是可到达的

    上面的一个例子:通过一个旧对象可以访问的年轻对象,而这个旧对象同时变成了垃圾,将被认为是可以访问的,并且会污染堆,直到一个主要的GC发生