即使对象的实例变量是对另一个变量的引用,对象是否符合GC的条件?

Eri*_*ves 5 java garbage-collection

我正在研究Java认证1Z0-803,我对垃圾收集存在疑问:

import java.util.*;

class X {
    List<String> list = new ArrayList<>();
}

public class TestGC {
    // Is an Object eligible for GC even if its instance variable is references to another variable
    public static void main(String[] args){
        X x = new X(); // 1
        List<String> list = x.list;
        x = null; // 2, Is X object reference eligible for garbage collection here?

        list.add("a");
        list.add("b");
        list.add("c");

        for(String item : list) {
            System.out.println(item);
        }
        list = null;// 3, Or X object reference eligible for garbage collection here, after list is set to null
    }
}
Run Code Online (Sandbox Code Playgroud)

x引用X在位置1处创建的对象.
此类X具有该类型的实例变量List.
如果我在局部变量list中的类型的x上引用了实例变量,然后设置为null,则引用的对象将符合此行中的GC条件(位置2),或者因为我引用了此对象的实例变量,当该对象的实例变量没有任何引用(位置3)时,该对象仅适用于GC?Xlistxx

JB *_*zet 6

最初,你有

stack --> x --> list
Run Code Online (Sandbox Code Playgroud)

因此,x可以从堆栈到达.

那你有

stack --> x --> list
     \          /
      \--------/
Run Code Online (Sandbox Code Playgroud)

x仍然可以从堆栈到达,并且列表也可以通过x和堆栈上的局部变量到达

然后你将x设置为null,所以你有

 stack      x --> list
     \          /
      \--------/
Run Code Online (Sandbox Code Playgroud)

而且你因此看到现在有了从堆栈到达x的方法.存在从x到列表的路径的事实是无关紧要的.因此允许VM收集x:

 stack           list
     \          /
      \--------/
Run Code Online (Sandbox Code Playgroud)