どのようにJavaのGCは、このような単純な状況では動作しない:使用は、それらが保持されるようになり、「オブジェクトで何かをやる」内のオブジェクトを使用する場合、通常ガベージコレクション
ArrayList<Object> list = new ArrayList<>();
list.add(new Object());
list.add(new Object());
//do something with objects
list.remove(0);
どのようにJavaのGCは、このような単純な状況では動作しない:使用は、それらが保持されるようになり、「オブジェクトで何かをやる」内のオブジェクトを使用する場合、通常ガベージコレクション
ArrayList<Object> list = new ArrayList<>();
list.add(new Object());
list.add(new Object());
//do something with objects
list.remove(0);
第1オフ:クラスObject
は「名前のないクラス」ではありません。まったくの場合、anonymous classesという文脈でこの用語を使用します。
GCには、GCルートから到達可能なすべてのオブジェクトが保持されます。他のすべてのオブジェクトは破棄されます。ローカル変数はGCルーツ(とりわけ)です。
説明しているのは、オブジェクトObject myObj = new Object();
のように、オブジェクトを直接指すリファレンス変数がない状況です。
ただし、オブジェクトへの参照を含むリストがあります。
GCを実行するとどうなりますか?それはリストを介して間接的に到達可能 あるので、あなたのオブジェクトは生きているとしてマークされるだろうlist.remove(0);
前
。 list.remove(0);
後
(とあなたのオブジェクトへの別の参照を確立含まない 「オブジェクトと何かをする」と仮定して)それはもう 到達できないので、あなたの オブジェクトは、GCなどによって生きているとマークされません。あなたのオブジェクトによって占有されていたメモリは、後に と表示されます。
まあlist.remove
コールがあっても、ガベージコレクションは行われません。
また、list
を可能な限り最短で宣言してください。これは、使用されている場所に最も近い場所です。そうすれば、リストは自動的にスコープから外れ、以前にGCされます。
また、オブジェクトの使用が終了した後にオブジェクトをnullに設定することもできます。それもスコープから外して、GCの対象となります。
3番目の段落では、オブジェクトをnullに設定することに言及しています。あなたはオブジェクトのリストの場所をnullに設定することを意味しますか? – bill
リスト内のオブジェクトを使って作業を終えても、nullに設定されているわけではありません。 –
最初のオブジェクトは、ガベージコレクションの対象となります(「オブジェクトで何かを行う」は、それを不適格にします)。それだけです。 –
ああ、ありがとう。私の実際のプログラムでは、私はそれをプログラムのどこか他の場所で流したと思う。 – bill