使用Mark& Sweep垃圾收集器,扫描物体的情况如何

时间:2014-05-12 11:30:54

标签: java garbage-collection

在Java中,假设我们使用的是Mark and Sweep垃圾收集器。在Mark阶段,收集器执行DFS,然后标记所有活动对象 live ,然后在扫描阶段,它通过所有对象并回收那些未标记的对象的内存< em> live (这就是我从MS GC的工作原理中学到的)。假设如果我只从根的一半开始,那么在标记阶段会有一些对象无法访问,那么它们没有被标记为 live ,当涉及到扫描阶段时,将会那些未标记的对象是GCed还是GC不知道如何处理它们,这意味着我们无法从一半的根启动GC?为什么?

1 个答案:

答案 0 :(得分:0)

  

如果我只从一半的根开始,

你最好不要这样说。甚至不要考虑它(见下文)。

  

然后在标记阶段会有一些对象无法访问,

它们可以访问,但算法无法访问它们。太糟糕了。

  

然后他们没有被标记为现场,

太糟糕了。

  

当涉及扫描阶段时,那些未标记的对象将被GC化

如果有任何GC忽略了根的一半,那么是。

  

或GC不知道如何处理它们,这意味着我们无法从根的一半启动GC?

完全。标记为实时的所有对象将保存在生存区域中。当GC的唯一原因是回收记忆时,你能做些什么呢?

当您拥有肯定存在的对象和处于未知状态的对象时,您可以回收什么内存?

<强> NONE

这就是问题所在。你想通过不遍历某些对象来保存工作,但在这种情况下,半完成的工作值得为零。

让一些物品的寿命超过必要的时间是可以的,但不是相反。