创建这么多强引用会出现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,为什么?

最佳答案

它仍然会发生OOM,为什么?


Integer正在清理,但是HashSetSoftReference不会被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);
}

08-05 17:45