调用System.gc()时,哪些对象可用于垃圾回收,为什么?

public class GCTest {
    static class A {
        private String myName;
        public A(String myName) {
            this.myName = myName;
        }
    }

    public static void main(String[] args) {
        A a1 = new A("a1");
        A a2 = new A("a2");
        ArrayList list = new ArrayList();
        list.add(a1);
        A[] mas = new A[2];
        mas[0] = a2;
        a2 = a1;
        clear(mas);
        a1 = null;
        a2 = null;
        System.gc();
        // some code
        ...
    }

    private static void clear(A[] mas) {
        mas = null;
    }
}

如果object == null变成垃圾还是没有?

我认为a1a2mas在调用System.gc()时可用于垃圾回收,因为它声明为null。还是我错了?

最佳答案

首先,您的程序变量永远不会“可用于垃圾回收”。 GC仅收集对象,并且程序变量是对对象的引用,而不是对象本身。 (在引用Java变量时常用的术语使这一点感到困惑。)

其次,a1a2mas引用的所有对象都不会进行GC处理。尽管事实上a1a2已设置为null。这是因为通过listmas仍然可以访问这些对象。为什么即使调用a2后,mas引用的对象仍然可以通过clear()到达?因为您不能通过将变量传递给mas方法来更改main()中的clear()变量的值。您在该方法中所做的所有事情都是在更改形式参数(也称为mas),它是与main()中的局部变量分开的变量。 Java严格按值传递。但是,当涉及对象时,始终传递的是引用。

通常,规则是,仅当对象无法从任何程序变量直接或间接访问对象时,才对对象进行GC处理。

09-13 10:30