假设有一个类 A 的对象 a,它持有对类 B 的另一个对象 b 的引用。这是对 b 的唯一引用。所以现在,如果对 a 的所有引用都被删除,那么 a 就可以进行 GC 了。这是否意味着 b 也准备好进行垃圾收集了?因为,虽然 b 有一个引用(在 a 内部),但它是不可访问的,因为 a 是不可访问的。
那么这个场景究竟是如何运作的呢?我的意思是垃圾收集的顺序。
最佳答案
一旦对象无法从根访问,它将被收集。参见 this question了解 GC 根的解释。
假设可能无法到达该子图中的任何节点,将收集整个子图(如您所述)。
Java(和 .NET)使用标记和清除垃圾收集来处理此类问题。
基于引用计数的系统(例如 C++ 的 std::shared_ptr<T>
)可能会在仍然无法访问的循环依赖项的情况下失败。这对于 Java/.NET GC 不是问题。
关于java - 如果仅从垃圾中引用一个对象,它就是垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505261/