有多少对象可用于垃圾回收?

时间:2017-11-02 10:18:01

标签: java garbage-collection

class Cardboard{
    Short story = 200;
    Cardboard go(Cardboard cb){
        cb = null;
        return cb;
    }

    public static void main(String args[]){
        Cardboard c1 = new Cardboard();
        Cardboard c2 = new Cardboard();
        Cardboard c3 = c1.go(c2);
        c1 = null;      
    }
}

执行go()后,c2应指向null,如方法所暗示的那样。c2的此引用将传递给c3变量,它再次指向null,因此c2的对象必须可用于垃圾收集。

1 个答案:

答案 0 :(得分:1)

那是不对的。将对象作为参数传递给方法时,它会传递对该对象的引用,仅此而已。对象的引用cb变为null,但c2仍然是对同一对象的引用,因此Java仍然认识到堆上的对象在指向它的代码中有一个引用: c2

正如Holger在下面的评论中所指出的,此特定代码段中的所有对象都有资格进行垃圾回收,因为它们未被使用。 Java的GC有多种方法可以确定某个对象是否有资格被收集,而且只有这样一个事实,即存在一个指向该对象的引用并不能保护它不被收集,但是该对象的使用会。 / p>