2016-05-08 6 views
1

多くの作成でOOMエラーが発生する強参照は、GCが強い参照を収集しないためですが、余分なメモリがない場合、GCは弱参照を収集します。だから私の質問は:それはなぜ、OOM発生し、まだだ 私は私の-Xmx2MSoftReferenceからOutOfMemoryが残っているのはなぜですか?

Set<SoftReference<Integer>> sa = new HashSet<~>(); 
for (int i = 0; i < size; i++) { 
    SoftReference<Integer> ref = new SoftReference<Integer>(i); 
    sa.add(ref); 
} 

を設定している間、私は弱い参照を作成するために、ループを作成しますか?

+0

i <サイズは何ですか? –

答えて

7

これはまだ発生していますが、なぜですか?

Integerのは、しかし、クリーンアップされているHashSetSoftReference sがGCによって削除されません。注:SoftReferenceオブジェクトはIntegerオブジェクトよりも大きいです。

あなたができることは、決してメモリが足りなくなることではありません。

SoftReference<HashSet<Integer>>> sa = null; 
for (int i = 0; i < size; i++) { 
    if (sa == null || sa.get() == null) 
     sa = new SoftReference<HashSet<Integer>>(new HashSet<Integer>()); 
    sa.get().add(ref); 
} 
関連する問題