在Java中,假设我们使用的是Mark and Sweep垃圾收集器。在Mark阶段,收集器执行DFS,然后标记所有活动对象 live ,然后在扫描阶段,它通过所有对象并回收那些未标记的对象的内存< em> live (这就是我从MS GC的工作原理中学到的)。假设如果我只从根的一半开始,那么在标记阶段会有一些对象无法访问,那么它们没有被标记为 live ,当涉及到扫描阶段时,将会那些未标记的对象是GCed还是GC不知道如何处理它们,这意味着我们无法从一半的根启动GC?为什么?
答案 0 :(得分:0)
如果我只从一半的根开始,
你最好不要这样说。甚至不要考虑它(见下文)。
然后在标记阶段会有一些对象无法访问,
它们可以访问,但算法无法访问它们。太糟糕了。
然后他们没有被标记为现场,
太糟糕了。
当涉及扫描阶段时,那些未标记的对象将被GC化
如果有任何GC忽略了根的一半,那么是。
或GC不知道如何处理它们,这意味着我们无法从根的一半启动GC?
完全。标记为实时的所有对象将保存在生存区域中。当GC的唯一原因是回收记忆时,你能做些什么呢?
当您拥有肯定存在的对象和处于未知状态的对象时,您可以回收什么内存?
<强> NONE 强>
这就是问题所在。你想通过不遍历某些对象来保存工作,但在这种情况下,半完成的工作值得为零。
让一些物品的寿命超过必要的时间是可以的,但不是相反。