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

为了记录,我不是 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行之后, C类型的2个对象有资格进行垃圾回收(GC)?

  • 为什么不是在第4行和第10行中将c1的副本传递给m1()方法。 因此,最终在第6行中,将有1个对象(不是2个)将有资格获得GC。 毕竟,不是java传递值而不是传递引用?


  • 是什么让你认为第6行之后有两种类型的C对象可用于GC? 我只看到一个( c2 )。 你用什么工具来告诉你呢?

    关于将c1传递给你的m1方法的问题:你通过(通过值)传递的是对象的引用 - 如果你愿意,可以抓取对象的句柄 - 不是它的副本。 事实上,你传递给m1是完全不相关的,事实上 - 你从不使用那个引用,你立即用一个新对象的引用覆盖它,然后你返回(这不会影响仍然引用的c1main )。


    pass-references-by-value和pass-values-by-reference之间有区别:)

    Java Pass By引用
    Java永远不会通过引用传递正确的权利
    按引用传递或按价值传递

    你可能想看看Jon Skeet关于C#参数传递语义的文章,因为这是他最喜欢的'程序员无知'pet peeve:
    什么是你最喜欢的'程序员无知'宠物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
    
    链接地址: http://www.djcxy.com/p/20667.html

    上一篇: Why does the specified object be eligible for garbage collection?

    下一篇: BitmapData.rect creates a new rectangle?