静态HashMap导致内存泄漏,但如何纠正呢?

时间:2013-01-08 07:01:45

标签: java memory-management memory-leaks static jvm

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

是类的实例变量。

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

问题在于密钥和值是相同的,因此当更新的指示即将到来时,H​​AshMap正在收集所有数据并且它从未进行过GC。它导致泄漏。

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

还有其他方法可以纠正这种泄漏。代码重构是不可能的,因为它真的很复杂,而且我的时间已经不多了。有人请指导我。在此先感谢

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果Hashmap入口对象(入口对象存储键值对)不适合进行垃圾回收。换句话说,即使与键值对关联的键对象为null,入口对象也将保留在内存中。

而在weakhashmap的情况下,当WeakHashMap中的An项不再用于普通用途时,它将自动将其删除(即使具有给定键的映射也不会阻止该键被所创建的垃圾收集器丢弃) finalizable,finalize然后回收。)。丢弃键后,它的条目会自动从地图中删除,换句话说,就是垃圾回收。

WeakHashMap中的每个键对象都作为Weak引用(也称为hard)引用的引用间接存储。因此,只有在键的弱引用之后(在地图内部和外部),才会自动删除键,已被垃圾收集器清除。 例: 公共静态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} {}