Java 带着马克&;清扫垃圾收集器,清扫对象的情况如何
在Java中,假设我们使用的是标记和清除垃圾收集器。在标记阶段,收集器执行DFS,然后将所有活动对象标记为活动,然后在扫描阶段,它将通过所有对象并回收未标记为活动的对象的内存(这就是我了解MS GC工作原理的地方)。比如说,如果我只从根的一半开始,那么在标记阶段会有一些对象不可访问,那么它们不会被标记为活动,当涉及到扫描阶段时,那些未标记的对象会被GCed还是GC不知道如何处理它们,这意味着我们不能从根的一半开始GC?为什么 如果我只从根的一半开始 你最好别这么说。甚至不要去想它(见下文) 然后在标记阶段会有一些无法到达的对象 它们是可以到达的,但算法无法到达。太糟糕了 那么他们就不会被标记为活的 太糟糕了 在扫描阶段,这些未标记的对象是否会被GCD 如果有任何GC忽略了根的一半,那么是的 或者GC不知道如何处理它们,这意味着我们不能从根的一半开始GC 没错。所有标记为活动的对象将保存在生存区域。当GC的唯一原因是回收内存时,您可以如何处理那些未标记的内容 当您拥有肯定处于活动状态的对象和处于未知状态的对象时,您可以回收哪些内存? 无 这就是问题所在。您希望通过不遍历某些对象来节省工作,但在这种情况下,完成一半的工作值为零Java 带着马克&;清扫垃圾收集器,清扫对象的情况如何,java,garbage-collection,Java,Garbage Collection,在Java中,假设我们使用的是标记和清除垃圾收集器。在标记阶段,收集器执行DFS,然后将所有活动对象标记为活动,然后在扫描阶段,它将通过所有对象并回收未标记为活动的对象的内存(这就是我了解MS GC工作原理的地方)。比如说,如果我只从根的一半开始,那么在标记阶段会有一些对象不可访问,那么它们不会被标记为活动,当涉及到扫描阶段时,那些未标记的对象会被GCed还是GC不知道如何处理它们,这意味着我们不能从根的一半开始GC?为什么 如果我只从根的一半开始 你最好别这么说。甚至不要去想它(见下文) 然后
允许某些对象的生存时间比需要的长是可以的,但不是相反。你说的“从根的一半开始”是什么意思?通常在标记阶段,我们对所有根进行DFS,但在这种情况下,我们只对它们的一半进行DFS。如果根是指来自活动范围的指针,显然,你必须考虑所有的根,以便检测可能被访问的内容,因此不会被垃圾收集。对不起,你的意思是“不受GECED”的影响?我的意思是重用那个内存是错误的。