2 java garbage-collection weakhashmap
我有一个测试应用程序,其中一个类存储一个地图,一个按钮调用该类的方法:
Map<Object, Object> weakMap = new WeakHashMap<Object, Object>();
Run Code Online (Sandbox Code Playgroud)
按钮执行此操作:
public void fillWeakHashMap(int size) {
List<String> createObjects = (List<String>) createObject(size);
for (Object ob : createObjects) {
weakMap.put(ob, ob);
}
}
Run Code Online (Sandbox Code Playgroud)
所以带有地图的主类生活,但我放在它上面的对象是用不同的方法创建的,因为WeakHashMap我认为退出方法后fillWeakHashMap,GC中的键/对象将被清除.
我打开VisualVM-> VisualGC并单击Monitor-> PerformGC 10次,旧空间几乎已满,这意味着GC不清除这些对象.那么我做错了什么?
WeakHashMap的javadoc的第一句话说:
基于哈希表的Map接口实现,带弱键.当其密钥不再正常使用时,WeakHashMap中的条目将自动被删除.更准确地说,给定密钥的映射的存在不会阻止密钥被垃圾收集器丢弃,即,可以最终化,最终化,然后回收.当一个键被丢弃时,它的条目将被有效地从地图中删除,因此该类的行为与其他Map实现略有不同.
它写道:
WeakHashMap中的值对象由普通的强引用保存.因此,应该注意确保值对象不直接或间接地强烈引用它们自己的密钥,因为这将防止密钥被丢弃.
也就是说,只有弱引用键,但强烈引用这些值.在您的代码中,每个键也使用一个值,因此被强烈引用,因此不会被垃圾回收.