在使用WeakReferences尝试一些示例时,我遇到了以下情况。我正在创建一个哈希表,并在Employee对象上填充了一个弱引用。现在我有两个强引用,employee和weakReference。我在try块中都将它们都设置为null。显式地调用gc,最终得到了块运行。
因此,在gc运行之后,由于没有对它的强引用,所以应该在堆中收集weakReference对象,但是当我打印地图时,它仍然具有指向旧的weakReference对象的键。这怎么可能?
Employee employee = new Employee(11);
WeakReference<Employee>weakReference=new WeakReference<Employee>(employee);
Map map = new HashMap<WeakReference<Employee>, String>();
map.put(weakReference, "Test");
System.out.println(map);
try {
employee = null;
weakReference=null;
System.gc();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("Inside finally");
}
System.out.println(map);
输出是
{java.lang.ref.WeakReference@659e0bfd=Test}
Inside finally
{java.lang.ref.WeakReference@659e0bfd=Test}
GC不会删除WeakReference本身,它只会删除其引用的对象,因此map仍将包含WeakReference。您应该检查的是weakReference.get()。在gc()之后应返回null。为了以防万一,请在检查之前创建一个Thread.sleep(1000),以便GC有一些时间来完成其工作
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句