【问题标题】:GC doesnt remove objects from weakhashmapGC 不会从弱哈希图中删除对象
【发布时间】: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


【解决方案1】:

WeakHashMap的javadoc第一句says

Map 接口的基于哈希表的实现,带有弱键。 WeakHashMap 中的条目在其键不再常用时将自动删除。更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。

再往下一点,它写道:

WeakHashMap 中的值对象由普通的强引用保存。因此,应注意确保值对象不会直接或间接地强烈引用自己的键,因为这会防止键被丢弃。

也就是说,只有键被弱引用,而值被强引用。在您的代码中,每个键也被用作一个值,因此被强引用,因此不会被垃圾回收。

【讨论】:

  • 谢谢!我将其更改为weakMap.put(ob,“”),现在我看到GC可以工作了-删除了一些旧对象,但留下了旧空间中的一些对象...此外,我还在使用permgen空间,并且正在使用循环使用 100k+ 操作,例如 new new XStream().fromXML(someXML) 增加 pergen in loop 但 GC 正在清除它们。是不是意味着我无法模拟 PergenSpace 异常?
【解决方案2】:

您为地图中的每个对象保留一个引用,例如 ob 仍然引用自己,这就是为什么没有清除任何内容,因为 GC 不能声称这些对象没有被使用并且可以被清除。

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 2022-12-11
    • 1970-01-01
    • 2023-03-08
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2012-04-19
    相关资源
    最近更新 更多