簡體   English   中英

為什么指定的對象有資格進行垃圾回收?

[英]Why does the specified object be eligible for garbage collection?

為了記錄,我不是 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?

pass-references-by-value和pass-values-by-reference有區別:)

Java Pass By Reference
Java永遠不會通過引用右轉
通過參考傳遞或通過價值傳遞

你可能想查看Jon Skeet關於C#參數傳遞語義的文章,看看它是他最喜歡的“程序員無知”的寵兒:
什么是你最喜歡的“程序員無知”的寵兒

所以基本上,我看到你的代碼執行以下操作:

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

是什么讓你認為在第6行后GC有兩個C類對象? 我只看到一個( c2 )。 你用什么工具告訴你呢?

關於將c1傳遞給m1方法的問題:你傳遞的內容(按值)是對象的引用 - 如果你願意,你可以抓住對象的句柄 - 不是它的副本。 你將引用傳遞給m1的事實是完全無關緊要的,事實上 - 你從不使用那個引用,你立即用一個新對象的引用覆蓋它,然后你返回(這不會影響仍在引用的c1main )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM