为什么指定的对象有资格进行垃圾回收?

时间:2010-02-19 16:08:59

标签: java garbage-collection core

为了记录,我是一个Java初学者,但是 - 而是 - 一个中级人员,有点忘了关于Java的基础知识。

class C{
    public static void main(String a[]){
        C c1=new C();
        C c2=m1(c1);        //line 4
        C c3=new C();
        c2=c3;              // line 6
        anothermethod();
    }
    static C m1(C ob1){
        ob1 =new C();      // line 10
        return ob1;
    }
    void anothermethod(){}
}

从上面的代码:

  • 为什么在第6行之后,2个C类型的对象符合垃圾收集(GC)的条件?

  • 为什么在第4行和第10行中,c1副本被传递到m1()方法。因此,最终在第6行中,将有1个对象(而不是2个)符合GC的条件。毕竟,不是java pass -by-value而不是pass-by-reference?

2 个答案:

答案 0 :(得分:4)

按值传递引用和引用传递值之间存在差异:)

Is Java Pass By Reference
Java is never pass by reference right right
Pass By Reference Or Pass By Value

你可能想查看Jon Skeet关于C#参数传递语义的文章,看看这是他最喜欢的“程序员无知”宠儿: What's your favorite 'programmer ignorance' pet peeve

基本上,我看到你的代码执行以下操作:

c1 = new C("Alice");
    // m1(C obj1) {     -- c1 gets passed to m1, a copy of the reference is made.
    //                  -- there are now two references to Alice (c1, obj1)
    //    obj1 = new C("Bob"); -- there is now one reference to Alice
                                // and one reference to Bob
    //    return obj1;  -- returns a reference to Bob(c1 still reference Alice)
    // }                -- when m1 returns, one of the references to Alice disappears.
c2 = m1(c1); // c2 points to Bob 
c3 = new C("Charlie");
c2 = c3;      // <-- Bob is eligible for collection. 
              // There are now two references to Charlie

答案 1 :(得分:1)

在第6行之后,您认为两个C类型的对象可用于GC的原因是什么?我只看到一个(c2)。你用什么工具告诉你呢?

关于将c1传递到m1方法的问题:您传递的内容(按值)是对象的引用 - 如果您愿意,您可以通过该句柄抓取对象 - 不是它的副本。将引用传递给m1这一事实完全无关紧要,实际上 - 您从不使用该引用,您会立即使用对新对象的引用来覆盖它,然后返回(这不会影响{{ 1}}仍在c1)中引用。