垃圾收集年轻一代扫描

时间:2014-10-09 14:13:05

标签: java garbage-collection

我试图理解垃圾收集机制,而且关于代际算法,我对年轻/老一代的差异有疑问。我读到了开始在年轻一代收集物品的GC正在标记它们从GC根源开始寻找活体,并且通常将它们复制到幸存者空间,清除年轻一代区域和瞧。

如果我们从GC的根源开始并且我们开始通过活动对象,我们不会发现这些对象并不是我们在老一代中发现的对象吗?这是否意味着当我们点击旧空间中的对象时,我们会停止在该点跟踪引用或什么?

2 个答案:

答案 0 :(得分:5)

虽然我还没有直接检查过这个问题,但常识表明每次遇到来自旧代的对象时,对象图遍历都会缩减。请注意,此检查非常便宜:对指针值进行简单的范围检查就足以确定对象在堆区域中的位置。

然而,还有另一个重要的考虑因素:如果一个年轻的物体只能通过一个旧物体到达怎么办?显然,老一代必须被视为以某种方式

输入卡表:这是每个堆区域前面的支持结构,其中保存区域的压缩“位图”视图,使得每个位对应于例如256个字节堆。每次更新引用类型变量时,卡表中的相应位将被提升为1,表示“脏”。

在卡表就位后,每个YG集合都会发生以下情况:标记为“脏”的所有堆的块都会被扫描,以指示Young Generation中的对象。以这种方式找到的每个对象都被认为是可达的。

以上的证据:通过同时变为垃圾的旧对象可以到达的年轻对象将被认为是可达的并且污染堆直到主要GC发生。

答案 1 :(得分:2)

当GC在Young Generation中运行时,它被称为Minor Collection。老一代的物体并不关心这种类型的集合。

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

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

引用HotSpot doc

  

当年轻一代填满时,会导致一个小小的收集   只收集年轻一代;其他的垃圾   几代人没有回收

对我而言,这意味着GC将浏览对象图,并可能在OldGen中找到垃圾,但不会回收它。

我发现这个IBM article很好地解释了代际引用跟踪在HotSpot GC中是如何工作的。