2014-02-17 119 views
2

在下面的代碼中,有多少對象在執行第7行後有資格進行垃圾回收? 在我看來,1個是z的對象是符合條件的。是對的?關於垃圾回收的困惑

public class Tester 
{ 
    public static void main(String[] args) 
    { 

    Integer x = new Integer(3000); 
    Integer y = new Integer(4000); 
    Integer z = new Integer(5000); 

    Object a = x; 
    x = y; 
    y = z; 
    z = null; //line 7 
    } 
} 

非常感謝。

回答

8

不要混淆引用與對象。該對象是已創建的實際項目,該引用僅僅是一個引用它的名稱。

您已經創建了三個對象,我們稱它們爲3000,40005000。你還設置了引用如下:

Ref Object 
--- ------ 
x -> 3000 
y -> 4000 
z -> 5000 

的任務後,你結束了:

Ref Object 
--- ------ 
a -> 3000 
x -> 4000 
y -> 5000 
z 

因此沒有對象受垃圾回收的。每一個人仍然有一個參考。


通過對比的方式,如果你要刪除行:

Object a = x; 

那麼任務將隨後導致:

Ref Object 
--- ------ 
     3000 
x -> 4000 
y -> 5000 
z 

對象我們叫3000將有資格進行垃圾回收,因爲您不再有任何方式訪問它。


而且,順便說一句,你可能要考慮這樣一個事實的重要原因自動垃圾收集創建一個是使這些各種各樣的問題毫無意義:-)一般來說(雖然也有例外當然的),你不應該需要擔心什麼對象被收集。

2

沒有任何對象符合垃圾收集條件

每個對象都有一個實時引用。 z不是一個對象,它只是一個參考。您只移動了參考。

1

x,y和z不是對象 - 它們是對象的引用。

非正式地,任何對象都有資格進行垃圾回收,如果沒有辦法可以永遠訪問它。運行此代碼後,x指向3000對象,y指向4000對象,z指向5000對象。無法收集3000物品,因爲您可以使用它,例如System.out.println(a);。無法收集4000對象,因爲您可以通過x來使用它,例如System.out.println(x);。 5000對象無法收集,因爲您可以通過z使用它。

main返回後,所有這些對象都有資格進行垃圾回收,因爲之後無法訪問它們。

1

z將不符合第7行的GC要求。這是因爲在第6行中,y正在折回先前由z引用的對象。所以即使你認爲你已經做出了z=null,y仍然在摺疊在堆中創建的對象即。 new Integer(5000);