带有对象的HashMap以后称为null和GC

时间:2015-04-09 15:05:21

标签: java performance garbage-collection hashmap

我对HashMaps感到困惑。如果我有一个HashMap,请说HashMap。然后我像这样添加键和值到HashMap

HashMap.put(1,myObj1);
HashMap.put(2,myObj2);
HashMap.put(3,myObj3);

现在,如果我执行myObj1 = null,那么HashMap中的值仍然可用我相信的原因(纠正我如果我错了)myObj1只包含指向内存中位置的指针(引用)。所以在HashMap中复制了myObj1的引用。由于myObj1现在指向无处(null),但hashMap中复制的值仍然指向内存位置。所以现在这个弱,强的是什么样的参考。将myObj1垃圾收集起来,如果它指向的值(值hasHashMap仍然指向),会发生什么。

2 个答案:

答案 0 :(得分:2)

如果没有引用指向,任何对象都只能被垃圾收集

如果您执行以下操作:

Object myObj1 = ....
myMap.put(1,myObj1);
myObj1 = null;

您拥有从myMapmyObj1的内部参考。 如果没有其他引用(显式或隐式)存在myMap,则将引用保留为myObj1时,它将成为垃圾回收的候选者。

因此,如果您明确地设置为null,则myMap myObj的引用将成为gc的候选者。

Object myObj1 = ....
myMap.put(1,myObj1);
myObj1 = null;    // myObj1 is not candidate to be gc
...
myMap = null;     // myObj1 and myMap are candidates to be gc 

答案 1 :(得分:1)

HashMap实现中的值始终具有强引用。这意味着什么,除非你删除元素/地图,否则它将被垃圾收集。在Java中有另一个名为WeakHashMap的实现,它将密钥存储为弱引用。无论是否从Map中删除,此密钥都将被垃圾收集。请注意WeakHashMap中的值仍然具有强大的参考价值。