Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带着马克&;清扫垃圾收集器,清扫对象的情况如何_Java_Garbage Collection - Fatal编程技术网

Java 带着马克&;清扫垃圾收集器,清扫对象的情况如何

Java 带着马克&;清扫垃圾收集器,清扫对象的情况如何,java,garbage-collection,Java,Garbage Collection,在Java中,假设我们使用的是标记和清除垃圾收集器。在标记阶段,收集器执行DFS,然后将所有活动对象标记为活动,然后在扫描阶段,它将通过所有对象并回收未标记为活动的对象的内存(这就是我了解MS GC工作原理的地方)。比如说,如果我只从根的一半开始,那么在标记阶段会有一些对象不可访问,那么它们不会被标记为活动,当涉及到扫描阶段时,那些未标记的对象会被GCed还是GC不知道如何处理它们,这意味着我们不能从根的一半开始GC?为什么 如果我只从根的一半开始 你最好别这么说。甚至不要去想它(见下文) 然后

在Java中,假设我们使用的是标记和清除垃圾收集器。在标记阶段,收集器执行DFS,然后将所有活动对象标记为活动,然后在扫描阶段,它将通过所有对象并回收未标记为活动的对象的内存(这就是我了解MS GC工作原理的地方)。比如说,如果我只从根的一半开始,那么在标记阶段会有一些对象不可访问,那么它们不会被标记为活动,当涉及到扫描阶段时,那些未标记的对象会被GCed还是GC不知道如何处理它们,这意味着我们不能从根的一半开始GC?为什么

如果我只从根的一半开始

你最好别这么说。甚至不要去想它(见下文)

然后在标记阶段会有一些无法到达的对象

它们是可以到达的,但算法无法到达。太糟糕了

那么他们就不会被标记为活的

太糟糕了

在扫描阶段,这些未标记的对象是否会被GCD

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

或者GC不知道如何处理它们,这意味着我们不能从根的一半开始GC

没错。所有标记为活动的对象将保存在生存区域。当GC的唯一原因是回收内存时,您可以如何处理那些未标记的内容

当您拥有肯定处于活动状态的对象和处于未知状态的对象时,您可以回收哪些内存?

这就是问题所在。您希望通过不遍历某些对象来节省工作,但在这种情况下,完成一半的工作值为零


允许某些对象的生存时间比需要的长是可以的,但不是相反。

你说的“从根的一半开始”是什么意思?通常在标记阶段,我们对所有根进行DFS,但在这种情况下,我们只对它们的一半进行DFS。如果根是指来自活动范围的指针,显然,你必须考虑所有的根,以便检测可能被访问的内容,因此不会被垃圾收集。对不起,你的意思是“不受GECED”的影响?我的意思是重用那个内存是错误的。