private static Map<interface,class> m =new HashMap<interface,class>;
是类的实例变量。
在class Synchronized(m){m.put(this,this);}
的构造函数中,
问题在于密钥和值是相同的,因此当更新的指示即将到来时,HAshMap正在收集所有数据并且它从未进行过GC。它导致泄漏。
我尝试了一个解决方法并删除了static关键字,它工作正常。但我认为删除静态可能会导致一些严重的问题。
还有其他方法可以纠正这种泄漏。代码重构是不可能的,因为它真的很复杂,而且我的时间已经不多了。有人请指导我。在此先感谢
答案 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} {}