为什么SoftReference会出现OutOfMemory?

时间:2016-05-08 10:58:19

标签: java jvm out-of-memory

在创建如此多的强引用时会出现OOM错误,因为GC不会收集强引用,但如果没有额外的内存,GC将收集弱引用。所以我的问题是: 在设置-Xmx2M

时,我创建了一个循环来创建弱参考
Set<SoftReference<Integer>> sa = new HashSet<~>();
for (int i = 0; i < size; i++) {
     SoftReference<Integer> ref = new SoftReference<Integer>(i);
     sa.add(ref);
}

它仍然出现在OOM,为什么?

1 个答案:

答案 0 :(得分:7)

  

它仍然出现在OOM,为什么?

Integer正在被清理,但GC不会删除HashSetSoftReference。注意: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);
}