Java和垃圾收集中的循环引用

时间:2017-01-11 21:18:25

标签: java garbage-collection

我们说我有以下类别,如下所述:

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="root"/>

如果我们查看引用的图形,A引用B(和B引用A),B引用C(和C引用B)。现在,如果我们要调用B的方法removeReferenceToC(),那么B对对象C的引用将被删除,但C仍然会引用B.此时C是否有资格进行垃圾收集?

我不确定的原因是因为引用C的方向不能再从B到达,这使我认为C有资格进行垃圾收集,但是C仍然引用B的事实是把我扔掉

因此,如果B将其对C的引用置空,那么C是否有资格进行垃圾收集?

编辑: 此问题被标记为重复。我认为我的问题与之前回答的问题之间的主要区别可以归结为: 以前的问题:  A - &gt; B&lt; =&gt; C然后从A到B的ref被移除,留下A B&lt; =&gt; ç

我的问题: A&lt; =&gt; B&lt; =&gt; C然后从B到C的ref被移除,留下A&lt; =&gt; B < - C

1 个答案:

答案 0 :(得分:1)

你在技术方面的想法太多了。垃圾收集定义为能够回收无法访问的对象存储的任何措施。

Java Language Specification §12.6.1定义:

  

可达对象是任何可以从任何活动线程继续计算中访问的对象。

有向引用是一种方式,运行代码如何访问对象,实际上,遍历这些引用是垃圾收集器实现如何检测对象的可达性的典型方式,但必须强调的是,即使存在,例如一个局部变量,如果没有“潜在的持续计算”读取它,则引用一个对象不足以阻止它的垃圾收集。

当JVM的优化器转换代码,消除未使用的变量和死代码时,就会发生这种情况。

链接部分还明确指出:

  

可以设计优化程序的转换,以减少可达到的对象数量,使其少于可以被认为可达的对象数量。

不会被这些技术细节分散注意力,只要知道访问对象的可能性与确定它不是垃圾就足够了。因此,无论对象如何与引用相互链接,如果没有活动线程可以访问它们,它们都是垃圾。

相关问题