当弱引用对象作为键放入HashMap时会发生什么?

时间:2014-10-31 10:50:48

标签: java garbage-collection

这是我的计划:

public class MemoryLeaksWithMapsWeakReference {

    private Map<MemoryLeaksWithMapsWeakReference, Integer> map = null;
    public MemoryLeaksWithMapsWeakReference() {
        map = new HashMap<MemoryLeaksWithMapsWeakReference, Integer>();
    }

    public static void main(String[] args) {

        MemoryLeaksWithMapsWeakReference m = new MemoryLeaksWithMapsWeakReference();
        while(true) {
            m.run();
        }
    }

    private void run() {

        MemoryLeaksWithMapsWeakReference mm = new MemoryLeaksWithMapsWeakReference();
        WeakReference<MemoryLeaksWithMapsWeakReference> ref = new WeakReference<MemoryLeaksWithMapsWeakReference>(mm);
        mm = null;
        map.put(ref.get(), 1);
        System.out.println(map.size());
    }
}

现在,如果一个对象是weakReferenced,它应该被垃圾收集器删除。但是,在上面提到的情况下(插入地图),它不是。有人能说出为什么地图条目(弱引用)没有被破坏吗?

2 个答案:

答案 0 :(得分:1)

ref.get()返回对象的null或hard引用。因此map不会包含任何“弱”引用。

答案 1 :(得分:1)

如果将对象(ref.get())放入哈希映射,则在地图内创建硬引用,因此无法对对象进行垃圾回收。

请参阅http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html