我正在尝试了解垃圾收集机制,并且研究了代算法,并且对年轻人/老人之间的差异有疑问。我读到,要开始在年轻一代中收集对象,GC就是从GC的根开始对其进行标记,以找到活的对象,通常将它们复制到幸存者空间,清理年轻一代区域和瞧。

如果我们从GC根目录开始,并且开始遍历 Activity 对象,那我就不明白了,难道我们也找不到老一代的对象吗?这是否意味着当我们在旧空间中碰到一个物体时,我们会停止在那一点上追踪引用或什么?

最佳答案

尽管我还没有直接检查这一点,但是常识表明,每次遇到旧一代对象时,对象图遍历都会减少。请注意,这种检查非常便宜:对指针值进行简单的范围检查就足以确定对象在堆区域内的位置。

但是,还有另一个要考虑的要点:如果只能通过旧物体才能到达年轻物体,该怎么办?显然,老一代必须以某种方式考虑。

输入卡表:这是每个堆区域前面的支持结构,在该堆区域中保留了该区域的压缩“位图” View ,因此每个位对应于256个字节的堆。每次更新引用类型的变量时,卡表中的对应位都会升为1,表示“脏”。

放置好牌桌后,每个YG集合都会发生以下情况:扫描标记为“脏”的所有堆块,以寻找指向Young Generation中对象的指针。以这种方式找到的每个对象都被认为是可到达的。

上面的一个花招:通过旧对象可到达的年轻对象同时已变成垃圾,这些对象将被视为可到达的,并污染堆,直到发生重大GC。

09-28 07:38