2016-04-05 4 views
1

どのようにJavaのGCは、このような単純な状況では動作しない:使用は、それらが保持されるようになり、「オブジェクトで何かをやる」内のオブジェクトを使用する場合、通常ガベージコレクション

ArrayList<Object> list = new ArrayList<>(); 

list.add(new Object()); 
list.add(new Object()); 
//do something with objects 
list.remove(0); 
+1

最初のオブジェクトは、ガベージコレクションの対象となります(「オブジェクトで何かを行う」は、それを不適格にします)。それだけです。 –

+0

ああ、ありがとう。私の実際のプログラムでは、私はそれをプログラムのどこか他の場所で流したと思う。 – bill

答えて

1

第1オフ:クラスObjectは「名前のないクラス」ではありません。まったくの場合、anonymous classesという文脈でこの用語を使用します。

GCには、GCルートから到達可能なすべてのオブジェクトが保持されます。他のすべてのオブジェクトは破棄されます。ローカル変数はGCルーツ(とりわけ)です。

説明しているのは、オブジェクトObject myObj = new Object();のように、オブジェクトを直接指すリファレンス変数がない状況です。

ただし、オブジェクトへの参照を含むリストがあります。

GCを実行するとどうなりますか?それはリストを介して間接的に到達可能 あるので、あなたのオブジェクトは生きているとしてマークされるだろうlist.remove(0);

  • list.remove(0);

  • (とあなたのオブジェクトへの別の参照を確立含まない 「オブジェクトと何かをする」と仮定して)それはもう 到達できないので、あなたの オブジェクトは、GCなどによって生きているとマークされません。あなたのオブジェクトによって占有されていたメモリは、後に と表示されます。

1

まあlist.removeコールがあっても、ガベージコレクションは行われません。

また、listを可能な限り最短で宣言してください。これは、使用されている場所に最も近い場所です。そうすれば、リストは自動的にスコープから外れ、以前にGCされます。

また、オブジェクトの使用が終了した後にオブジェクトをnullに設定することもできます。それもスコープから外して、GCの対象となります。

+0

3番目の段落では、オブジェクトをnullに設定することに言及しています。あなたはオブジェクトのリストの場所をnullに設定することを意味しますか? – bill

+0

リスト内のオブジェクトを使って作業を終えても、nullに設定されているわけではありません。 –

関連する問題