2017-01-31 5 views
1

次のスニペット(教育的なテストのみを目的としています)では、は常にtrueです。要素が弱いセットから削除されたときにテストする方法はありますか?

Set<String> weakSet = Collections.newSetFromMap(new WeakHashMap<>()); 
    weakSet.add("someKey"); 
    System.gc(); 
    weakSet.contains("someKey"); 

Iは、スペースを再利用するために、JVMによって行わbest effortは弱くしか到達可能(任意強い参照せずに弱い組の要素)であるオブジェクトを除去することを含むことが予想されます。しかし、私は間違っています。

実際に弱参照の自動削除をテストする方法があるので、参照が消えているのを確認できますか?言い換えれば、を返す方法は間違っていますか?

+2

スニペットが常に「true」を返す理由は、['文字列リテラルは通常ガベージコレクトされません](https://stackoverflow.com/questions/15324143/garbage-collection-of-string-literals)です。 –

答えて

2

@Chai T.Rexが解説で正しく言及されているように、文字列はガーベッジコレクションの悪い例です。オブジェクトがガベージウィークセットから収集されているかを確認するには、コードのこの修正版試してみてください。

Set<Object> weakSet = Collections.newSetFromMap(new WeakHashMap<>()); 
    weakSet.add(new Object()); 
    System.out.println(weakSet.size()); // prints "1" 
    while (weakSet.size() > 0) 
     System.gc(); 
    System.out.println(weakSet.size()); // prints "0" 

を、一般的に、ここで何が起こる:我々はセット(weakSet.add(new Object()))に新しいオブジェクトを追加します。しかし、我々はそれについての参照を保持しないため、GCはこのオブジェクトがセットから削除されることを見つけるでしょう。

GCのループが必要です。この単純な例のガベージコレクションは保証されていないためです。

+0

確かに答えです。啓発に感謝します! – ARX

+1

...または元のコードの2行目を 'weakSet.add(newString(" someKey "));' – Holger

+0

@Holger、nice ideaに変更します。しかし、直感的にはそれほど簡単ではないようです。 – Andremoniy

関連する問題