0

private static Map<interface,class> m =new HashMap<interface,class>;

是一个类的实例变量。

在 的构造函数中class Synchronized(m){m.put(this,this);}

问题是这里的键和值是相同的,因此当更新的指示即将到来时,H​​AshMap 正在收集所有数据并且它永远不会被 GC。它导致泄漏。

我尝试了一种解决方法并删除了 static 关键字,它工作正常。但我认为删除 static 会导致一些严重的问题。

有没有其他方法可以纠正这种泄漏。代码重构是不可能的,因为它真的很复杂,而且我的时间不多了。任何人请指导我。提前致谢

4

3 回答 3

3

如果哈希映射保留了您不想要的条目,那是因为您没有删除它们。

如果您只保留所需的条目,则静态集合没有特别的原因会导致内存泄漏。

于 2013-01-08T07:18:02.063 回答
0

如果它适合您的用例,请参阅 WeakHashMap

于 2018-02-10T03:59:52.073 回答
0

如果 Hashmap 条目对象(条目对象存储键值对)不符合垃圾回收条件。换句话说,即使与键值对关联的键对象为空,条目对象仍将保留在内存中。

而在weakhashmap的情况下,WeakHashMap中的An条目将在其键不再正常使用时自动被删除(即使对给定键进行映射也不会阻止该键被垃圾收集器丢弃然后回收)。当一个键被丢弃时,它的条目会自动从映射中删除,换句话说,就是垃圾回收。

WeakHashMap 中的每个键对象都间接存储为弱引用(也称为硬引用)的引用。因此,只有在映射内部和外部的弱引用被清除后,键才会自动删除由垃圾收集器。示例: public static void main(String[] args) {

    Map<String, String> map = new HashMap<String, String>();
    Map<String, String> map2 = new WeakHashMap<String, String>();
    String hashmapKey = new String("hashmapkey");
    String weakhashmapKey = new String("weakhashmapkey");

    map.put(hashmapKey, "value");
    map2.put(weakhashmapKey, "value");
    System.out.println("Before garbage call");
    System.out.println(map);
    System.out.println(map2);

    hashmapKey = null;
    weakhashmapKey = null;

    System.out.println("After garbage call");
    System.gc();
    System.out.println(map);
    System.out.println(map2);

}

输出:

垃圾调用前 {hashmapkey=value} {weakhashmapkey=value} 垃圾调用后 {hashmapkey=value} {}

于 2019-10-25T09:26:45.213 回答