2016-07-27 14 views
0

給定下面的代碼。對象objectOfA_In_B的最終價值是多少?Java中的對象分配和GC行爲

Class A 
{ 
    // Some parameters and method with complicated logic goes here 
} 


Class B 
{ 
    A objectOfA_In_B = new A(); 

    B() 
    { 
    // Operation done on objectOfA 
    } 

    public A getObjectA() 
    { 
     return objectOfA_In_B; 
    } 
} 


Class C 
{ 
    public static void main(String[] args) 
    { 
     try 
     { 
      A objectOfA_In_C = null; 
      B objectOfB = new B(); 

      objectOfA_In_C = B.getObjectA() 

      // Rest of logic goes here 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
     finally 
     { 
      objectOfA_In_C = null; 
     } 
    } 
} 

問題是:objectOfA_In_Bnull以及在最後C的主要方法塊僅僅是因爲他們pointting同一個對象設置objectOfA_In_CnullobjectOfA_In_CobjectOfA_In_B是否準備好從垃圾收集器收集?

回答

1

請問objectOfA_In_B爲空以及通過設置objectOfA_In_C在最後C'S主要方法塊空 只是因爲他們是pointting 到同一個對象?

不,Java是按價值傳遞的。即使對對象的引用也是按值傳遞的。因此,通過將objectOfA_In_C設置爲null,objectOfA_In_B將不會變爲空。

是objectOfA_In_C和objectOfA_In_B都準備好了收集 從垃圾收集

還有就是這裏的問題A只有一個實例和2個引用指向它(其中一個被設置爲nullfinally區塊)。當沒有引用指向它時,該實例將準備好GC。請注意,objectOfA_In_B仍指向該實例。

+1

因此,如果變量'objectOfA_In_B'在'B'中設置爲'null',那麼由'A'創建的唯一對象將準備好由GC收集。正確嗎? – Salman

+0

@Salman - 是的,如果沒有對象的引用,那麼它將符合GC的條件。你可以重寫'finalize()'和*可以是*,你可以自己看到行爲 – TheLostMind

+0

@TheLostMind - *也許*你可以看到行爲。有各種各樣的混雜因素可能意味着你沒有觀察到你期望觀察到的東西。 –

1

這裏有兩個變量,只有一個對象。任何一個變量都可以指向對象。對變量的賦值對其他變量沒有影響。當沒有變量指向它時,該對象(不是變量)已準備好進行垃圾回收。變量不能被垃圾回收,只有對象可以。

(因爲這看起來像功課,我留下來被你做了一些結論,因爲你想學習。:))

+0

這不是一個家庭作業。這是生產環境中的內存泄漏問題:P – Salman

+1

您是否可以將泄漏進程的堆轉儲?如果是,將其加載到Eclipse Memory Analyzer工具中會顯示泄漏的原因。 –

1

這不會是null因爲你分配null只是局部參考。這不會改變任何可能指向該對象的引用。所以objectOf_A_In_B不受影響,因此沒有準備好由GC收集