如果我在堆上有两个相互引用但不链接到任何引用变量的对象,那么这些对象是否可以被垃圾收集?
是的,它们是相关的。基本上,GC从“已知根”(静态变量、所有线程中的所有堆栈帧的局部变量)开始遍历以查找无法进行垃圾回收的对象。如果没有从根获取对象的方法,则该对象可用于收集。
编辑:汤姆指出了这一点,我认为值得将其提升到答案本身中:
从技术上讲,静态变量不是 根——它们由类引用 引用由类加载器引用 引用由对象引用的类 引用由根引用引用的对象。
大多数情况下,这种差异可能无关紧要,但了解这一点是很好的:)
像往常一样,Skeet说得很对。我只想补充一下,你描述的情况是为什么引用计数(早期C++智能指针的标准策略)不再使用的原因。