Java WeakHashMap Class



我想测试Java WeakHashMap Class功能,为此我编写了以下测试:

public class WeakHashMapTest {
public static void main(String args[]) {
    Map<String, Object> weakMap = new WeakHashMap<>();
    String x = new String("x");     
    String x1 = new String("x1");   
    String x2 = new String("x2");   
    weakMap.put(x, x);
    weakMap.put(x1, x1);
    weakMap.put(x2, x2);
    System.out.println("Map size :" + weakMap.size());
    // force all keys be eligible
    x=x1=x2=null;
    // call garbage collector 
    System.gc();
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("Map size :" + weakMap.size());
    System.out.println("Map :" + weakMap);
}
}    

在运行WeakMapTest类后,我非常惊讶地得到了以下输出:

GC 之前的映射: {x=x, x1=x1, x2=x2}GC 后的映射: {x=x, x1=x1, x2=x2}

当我预计地图将是空的时。

也就是说,垃圾回收器没有完成它的工作。但是为什么?

WeakHashMap不再强可访问时,垃圾回收器将回收其密钥。

实现说明:弱哈希映射中的值对象由普通强引用保存。因此,应注意确保值对象不会直接或间接强烈引用自己的键,因为这将防止键被丢弃。

但是,由于您使用了键本身作为值,因此该值仍然可以强访问,这意味着垃圾回收器无法回收键。

但是,如果使用其他对象作为值,则对键的唯一引用将是键本身。

weakMap.put(x, new Object());
weakMap.put(x1, new Object());
weakMap.put(x2, new Object());

然后,在清除变量并像您已经完成的那样调用垃圾收集器后,我得到输出:

Map size :3
Map size :0
Map :{}

即使对System.gc()的调用不能保证垃圾回收器运行,它看起来也会在这里运行。

System.gc()实际上是运行垃圾回收器的建议。 没有保证强制垃圾回收器运行的方法。

相关内容

  • 没有找到相关文章

最新更新