这是唯一符合垃圾回收条件的变量吗?

Is this the only variable eligible for garbage collection?

我对这段代码的垃圾收集资格有疑问。

public static void main(String[] args) {
    Object a = new Object();
    Object b = new Object();
    Object c = new Object();
    a = b;
    b = c;
    c = null;
}

我已经通读了几个 Java 垃圾回收的例子,我想我已经掌握了窍门。所以我在想的是,在 c = null; 行之后,只有 c 有资格进行垃圾回收,因为它是唯一一个丢弃了对它的所有引用的对象。我在这儿吗?

谢谢!

只有当object才有资格垃圾collection.Take一张纸画出来,你就知道了。

在Java中,变量不符合垃圾回收条件; 对象 是。变量保存对对象的引用,但不是对象本身。

让我们用一些示例对象 ID(JVM 用来跟踪它们的内部标识符,通常不可见)来查看您的示例:

Object a = new Object(); // id=1
Object b = new Object(); // id=2
Object c = new Object(); // id=3

您现在有对象 1、2 和 3,每个对象都从一个变量引用:a:1, b:2, c:3。当您在变量之间复制这些引用时,状态如下所示:

a = b;    // a:2, b:2, c:3
b = c;    // a:2, b:3, c:3
c = null; // a:2, b:3, c:null

a = b 之后,您丢失了对对象 1 的所有引用,该对象最初位于 a 中,因此它立即符合垃圾回收条件。对象 2 和 3 仍然可以访问,直到块结束,所有变量一起超出范围。

正如我读的书 OCA Java SE 7

An object is marked as eligible to be garbage collected when it can no longer be accessed, which can happen when the object goes out of scope. It can also happen when an object’s reference variable is assigned an explicit null value or is reinitialized.

所以,如果我们应用这个定义,答案将是:object a。这里我重复object而不是reference.We一定要区分object和reference!!!