2016-08-08 42 views
0

ハッシュマップの中にいくつかのオブジェクトがあります。これらのオブジェクトにはバイトバッファが含まれています。今私はそれらのバイトバッファを解放したい。ですから、もし私がhashmapリファレンスをnullにすると、それらのオブジェクトはすべてガベージコレクタとバッファの解放が可能になります。またはそれらをすべて明示的にnullにする必要があります。オブジェクトをガベージコレクションする方法を教えてください。

+0

一般的にガベージコレクションのためにコードからオブジェクトを取得する方法はありません。したがって、要素全体を解放するためには、hashmap参照をnullにするだけで十分です。 –

答えて

0

プログラムのどこにも参照が残っていない場合、それらのオブジェクトはガベージコレクションの準備ができています。 これが発生する時間は、使用するガベージコレクタによって大きく異なります。

1

基本的には到達可能度になります。オブジェクトに、コード内にあるもの(aを持つa - > b - > c)から始まる参照(通常)の参照によって到達できない場合、GCに適格です。できれば、そうではありません。もう何もあなたのオブジェクトを参照していなければ、到達できないため、バイトバッファはGCに適格です。

ハッシュマップの中にいくつかのオブジェクトがあります。

私はそれらがキーではなく値であると仮定します。 (あなたがHashMapからエントリを削除するか、単にnullにキーの値を設定するかどうかの観点からこれだけの問題。)そのためにそう

私はちょうどそれがすべてのこれらのオブジェクトを可能にするハッシュマップの参照はnullを作る場合ガベージコレクションを準備し、バッファを解放する。またはそれらをすべて明示的にnullにする必要があります。

は、あなただけの、例えば、あなたのオブジェクトを解放する完全HashMapからエントリを削除するか、あなたのオブジェクトへHashMapの参照を解放するであろう、nullにエントリの値を設定する必要があります。それがあなたのオブジェクトに対する唯一の参照であれば、そのオブジェクトはGCに適格になります。あなたのオブジェクトがバイトバッファへの参照を持つ唯一のものなら、それはまたGCに適格になります。オブジェクトのバイトバッファへの参照を明示的に解放する必要はありません。

コードは、そう、1024ワード価値がある:他の場所

class Thingy { 
    private byte[] buffer; 

    MyObject() { 
     this.buffer = new byte[1024]; 
    } 
} 

Map<String, Thingy> m = new HashMap<>(); 

m.put("foo", new Thingy()); 
// At this point, the HashMap refers to the Thingy, and the Thingy refers to the 
// buffer, so neither of them is eligible for GC 

m.remove("foo"); // or m.put("foo", null) if that's really appropriate 
// At this point, nothing refers to the Thingy anymore, and so both the Thingy and 
// its buffer are eligible for GC 

Javaは、この規則の例外ですweak referencesの概念を持っています。たとえそのオブジェクトが含まれているWeakReferenceからオブジェクトを取得することができたとしても(その時点ではそれはWeakReferenceで到達できなくても)オブジェクトをGCさせることができます。

+0

GCルーツの概念について言及する必要があります。グラフ内のパスを分析することは、出発点があれば意味をなさない – the8472

0

はい、他の参照がない限り(おそらく手動で)、ガベージコレクションされます。マップへの参照がある場合は、はい、ガベージコレクションされます。

私の考え:

私が呼び出す場合:MYMAP = NULL; マップ内の関連するハッシュマップキーまたは値オブジェクトで実際にはどうなりますか? これらのオブジェクトもガベージコレクションされますか、またはmyMapオブジェクト内のすべての関連オブジェクトをnullに設定する必要がありますか?

myMapには、いくつかの他のオブジェクトでまだ到達可能ないくつかのキーと値が保持されているとしましょう。 次に、

  • すぐには何も起こりません。
  • これらのキーと値にマップを介してしか到達できない場合は、到達不能になり、ガベージコレクションの対象となります。この場合、内部オブジェクトへの参照にnullを割り当てる必要はありません。
  • しかし、内部ノードが他のパスを経由して到達可能であれば、それらはおそらく到達可能であるため、ガベージコレクションの対象にはなりません。また、マップをnullにすると、ガベージコレクションされません。
関連する問題