2016-07-27 7 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_B彼らは同じオブジェクトをpointtingされているというだけの理由CのmainメソッドのfinallyブロックにnullobjectOfA_In_Cを設定することにより、同様nullでしょうか? objectOfA_In_CobjectOfA_In_Bの両方がガベージコレクタから収集される準備ができていますか?

答えて

1

ウィルobjectOfA_In_B彼らは同じオブジェクトを をpointtingているという理由だけでobjectOfA_In_Cは、Cのmainメソッドのfinallyブロックで をnullに設定することにより、ヌルにもなります?

いいえ、Javaは値渡しです。オブジェクトへの参照も値渡しされます。したがって、objectOfA_In_Cnullに設定すると、objectOfA_In_Bはnullになりません。

ありAのインスタンスが1つだけここで問題にあり、nullに設定されているそのうちの一つ、それを指している2つの参照(

ガベージコレクタからobjectOfA_In_CとobjectOfA_In_Bの両方が収集を取得する準備ができている ていますブロックfinally)。そのインスタンスは、それを指す参照が存在しないときにGCの準備ができています。objectOfA_In_Bはまだそのインスタンスを指しています。

+1

変数 'objectOfA_In_B'が' B'で 'null'に設定されていると、' A'で作成されたオブジェクトだけがGCによって収集できる状態になります。正しい? – Salman

+0

@サルマン - はい、オブジェクトへの参照がない場合は、GCに適格です。あなたは 'finalize()'をオーバーライドすることができ、*は*かもしれません。あなた自身が動作を見ることができます – TheLostMind

+0

@TheLostMind - *多分*あなたは動作を見ることができます。あなたが観察することが期待されるものを観察しないことを意味する可能性のあるさまざまな混乱要因があります。 –

1

ここには2つの変数と1つのオブジェクトしかありません。変数のいずれかがオブジェクトを指し示すことができるかどうか。変数への代入は他の変数には影響しません。オブジェクト(変数ではありません)は、変数が指していないときにガベージコレクションの準備ができています。変数はガベージコレクトできません。オブジェクトだけがガベージコレクションを実行できます。

(これは宿題のように見えるので、あなたが学びたいことから、私は、あなたによって作られるいくつかの結論を残した。:))

+0

宿題ではありません。プロダクション環境でメモリリークの問題があります:P – Salman

+1

リークプロセスのヒープダンプを取ることはできますか?はいの場合、Eclipse Memory Analyzer Toolにロードすると、リークの原因が表示されます。 –

1

ローカル参照にちょうどnullを割り当てるので、それはnullではありません。それは、そのオブジェクトを指す可能性のある参照を変更しません。だから、objectOf_A_In_Bは影響を受けませんので、準備ができていないが、GCによって収集される

関連する問題