【发布时间】:2015-05-02 15:13:26
【问题描述】:
我有一个测试应用程序,它有一个存储地图的类和一个调用该类方法的按钮:
Map<Object, Object> weakMap = new WeakHashMap<Object, Object>();
按钮执行以下操作:
public void fillWeakHashMap(int size) {
List<String> createObjects = (List<String>) createObject(size);
for (Object ob : createObjects) {
weakMap.put(ob, ob);
}
}
因此,带有地图的主类仍然存在,但我放入它的对象是在单独的方法中创建的,因为它是 WeakHashMap,我认为在退出方法 fillWeakHashMap 后,地图中的键/对象将是由 GC 清除。
我打开 VisualVM->VisualGC 并单击 Monitor->PerformGC 10 次,旧空间几乎已满,这意味着 GC 没有清除这些对象。那我做错了什么?
【问题讨论】:
-
尝试使用
weakMap.put(ob, "")而不是weakMap.put(ob,ob)。 -
谢谢!我将其更改为weakMap.put(ob,“”),现在我看到GC可以工作了-删除了一些旧对象,但留下了旧空间中的一些对象...此外,我还在使用permgen空间,并且正在使用循环使用 100k+ 操作,例如 new new XStream().fromXML(someXML) 增加 pergen in loop 但 GC 正在清除它们。是不是意味着我无法模拟 PergenSpace 异常?
标签: java garbage-collection weakhashmap