2016-12-27 43 views
-2

我有點困惑,找出有多少個對象資格GC時線18 PLZ解釋有多少個對象資格GC當行18 // TODO

class B{} 
class A{ 
    static B b1; 
    B b2; 
} 
public class Test { 
    public static void main(String[] args) { 
     B b1=new B(); 
     B b2=new B(); 
     A a1=new A(); 
     A a2=new A(); 
     a1.b1=b1; 
     a1.b2=b1; 
     a2.b2=b2; 
     a1=null; 
     b1=null; 
     b2=null; 
     // TODO Auto-generated method stub 
    } 
} 

有多少個對象資格用於GC當線19

+1

取決於哪個行是行19的對象) – Mark

+1

假設線19是最後的(main括號),因爲這是程序的結束,所有對象都有資格使用GC。有多少是我無法確切說出的,因爲我不確切知道JVM加載了哪些類。在'a1 = null;'之後,只有'a1'符合gc。在'b1 = null;'之後,'b1'獲得GC資格。在b2 = null;'之後''b2'不符合GC的條件,因爲它仍然可以通過'a2.b2'到達。 – Turing85

+0

參考我以前的評論:請注意,當我運行「'a1'獲得符合GC的條件時」,我的意思是「該對象,在被設置爲null之前引用的a1'獲得了符合GC的條件」。很難談論這個問題,因爲只要它不被垃圾收集,它就存在和無名。我希望意圖清楚。 – Turing85

回答

1

假設線19是由TODO Auto-generated method stub標記線,然後由程序的唯一對象,其是用於通過線19 GC 資格創建的對象的是由可變A1所指的對象。

最初分配給a2的對象仍然被分配,因此它不可用。

A.b1中的靜態值仍然分配給最初分配給b1的對象,因此對象不可用於GC - 靜態值在類的整個生命週期中都存在,因此即使實例a1可能會得到GC' d通過它分配的靜態實例仍然可以被引用。

因爲實例a2仍然分配,所以實例字段a2.b2也不可用於GC。該值保存最初分配給主方法中局部變量b2的B的實例。

在主方法中創建的四個對象中,程序的最後一行實際可用的唯一一個對象是最初分配給a1的對象。這只是引用已被設置爲空,因此沒有實例無法再到達。所有其他實例都可以通過局部變量(a2),靜態引用(A.b1)或實例引用(a2.b2)訪問。

1

綠色對象有資格進行垃圾回收。

只要一個對象有資格進行垃圾回收,該對象內的引用就無關緊要了。

但是,靜態引用實際上並不需要存在一個對象(右側沒有:A意味着顯示靜態引用b1)。

:A表示的類的對象的

:B表示B類

enter image description here