2013-04-02 47 views
0

當我學習LinkedList的數據結構,這個問題就會出現。假設每個鏈接(或節點)由包含兩個字段的對象表示,數據 & 下一個指向下一個鏈接。如果我想刪除一個特定的節點,顯然我會更新之前鏈接的下一個字段。但是,我是否應該將已刪除的鏈接的下一個字段設置爲空,以確保它將被垃圾收集器回收?威爾Java垃圾收集回收非引用的對象包含引用到其他對象

如果我的描述不清楚,我嘗試概括(或簡化)我的問題。假設對象a1A它有一個領域,其中引用另一個對象a2同一類。如果沒有提及對象a1,它是否有資格使用垃圾收集器?或者,我們必須明確地設定基準場A1? (不關心對象a2,除a1中的參考字段外還有其他參考。

回答

4

垃圾收集器理想地收集所有對象,這是程序流無法訪問的。即使此對象具有對JVM中所有內容的引用。
如果程序的所有正在運行的線程都不包含任何直接間接引用它,則對象變得無法訪問。
直接引用如下:

void main(String... args){ 
    Object a = new Object(); // <- from here main thread of program 
          // has reference to object `a` 
    ... 
} 

間接引用如下:

void main(String... args){ 
    List b = new ArrayList(); 
    b.add(new Object()); // <- here you can't access object by typing `a` 
    // as in previous example, but you can get access with `b.get(0);` 
    // so that object can be accessed indirectly -> it is reachable. 
} 

它還處理對象的大島嶼,其中有相互引用的正常情況,但沒有一個可以從程序流中再次訪問。

MyClass a = new MyClass(); 
MyClass b = new MyClass(); 
a.field = b; 
b.field = a; 
// at this point a and b are reachable so they cannot be collected 
b = null; 
// at this point b's object is reachable indirectly through `a.field` 
// so neither a nor b can be collected 
a = null; 
// at this point you cannot reach neither a nor b 
// so a and b can be garbage collected, 
// despite the fact that a is referenced by b and vice versa 

UPD:增加了例子,改了一些詞讓答案更清晰。

0

所有孤兒對象都自動符合垃圾回收的條件。而且你不需要將顯式設置爲空引用(但是這是一個很好的編碼習慣)。

0

當垃圾收集器運行,它會看到,現在a1需要進行垃圾回收,因爲有它不再引用。

它也將刪除引用領域a1指向的a2

,但仍反對對a2(如你所提到的a2有它除了參考場A1其他參考資料),所以它沒有資格收集垃圾,因此它仍然存在。

1

即使您的對象的字段仍然引用其他對象,也可以收集對象a1。您不需要將其字段設置爲空。

垃圾收集器收集的對象不是可達。一個對象可以持有對他人的引用並仍然被收集。一個對象可能有其他不可達對象的引用,並且仍然被收集。