Java 当弱引用对象将itno HashMap作为键时会发生什么?

Java 当弱引用对象将itno HashMap作为键时会发生什么?,java,garbage-collection,Java,Garbage Collection,这是我的节目: public class MemoryLeaksWithMapsWeakReference { private Map<MemoryLeaksWithMapsWeakReference, Integer> map = null; public MemoryLeaksWithMapsWeakReference() { map = new HashMap<MemoryLeaksWithMapsWeakReference, Integ

这是我的节目:

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());
    }
}
公共类MemoryLeakSwithMopsWeakReference{
私有映射=null;
公共内存rakswithmapsweakreference(){
map=新的HashMap();
}
公共静态void main(字符串[]args){
MemoryLeaksWithMapsWeakReference m=新的MemoryLeaksWithMapsWeakReference();
while(true){
m、 run();
}
}
私家车{
MEMORYLEAKSWITHMAPSWEAKREFENCE mm=新的MEMORYLEAKSWITHMAPSWEAKREFENCE();
WeakReference ref=新WeakReference(毫米);
mm=零;
map.put(参考get(),1);
System.out.println(map.size());
}
}
现在,如果一个对象被WeakReference,它应该被垃圾收集器删除。但是,在上述情况下(插入到地图中),情况并非如此。有人能告诉我为什么地图条目(弱引用)没有被销毁吗

ref.get()返回对对象的null或硬引用。因此映射将不包含任何“弱”引用。

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


请参见

您能解释一下您想要实现的目标吗?无论如何,它们可能不是GC,因为GC认为它们仍然被使用(这是真的),或者可能是因为GC根本不被调用。顺便说一下,这个示例代码是非常可怕的。你不能通过把它放在一个地图或任何类型的集合中来创建一个对弱引用的引用的硬引用,这似乎就是问题所在。