繁体   English   中英

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

[英]static HashMap is causing the memory leak,but how to rectify it?

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

是一个类的实例变量。

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

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

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

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

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

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

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

如果 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} {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM