Java中垃圾收集器的工作

ip6*_*696 3 java garbage-collection

在通话时有哪些对象可用于垃圾收集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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

如果object == null它变成了垃圾?

我认为a1,a2并且mas在调用时可用于垃圾收集,System.gc()因为它处于null状态.或者我错了?

Ted*_*opp 8

首先,您的程序变量永远不会"可用于垃圾回收".GC只收集对象,程序变量是对象的引用,而不是对象本身.(引用Java变量的常用术语混淆了这一点.)

其次,没有被引用的对象a1,a2mas将要GC'ed.尽管事实已经a1并且a2已经确定了null.这是因为对这些对象的引用仍然通过两种抵达listmas.为什么引用的对象即使在调用之后a2仍然可以访问?因为你不能改变的变量的值在由变量传递给方法.您在该方法中所做的只是更改形式参数(也称为),它是与本地变量的单独变量.Java严格按值传递.然而,当涉及到对象时,总是传递的是一个masclear()masmain()clear()masmain()参考.

通常,规则是只有当对象无法直接或间接从任何程序变量访问时,对象才会被GC.