这是我的计划:
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,它应该被垃圾收集器删除。但是,在上面提到的情况下(插入地图),它不是。有人能说出为什么地图条目(弱引用)没有被破坏吗?
答案 0 :(得分:1)
ref.get()返回对象的null或hard引用。因此map不会包含任何“弱”引用。
答案 1 :(得分:1)
如果将对象(ref.get()
)放入哈希映射,则在地图内创建硬引用,因此无法对对象进行垃圾回收。
请参阅http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html