【发布时间】:2012-12-21 23:59:12
【问题描述】:
private static Map<interface,class> m =new HashMap<interface,class>;
是一个类的实例变量。
在class Synchronized(m){m.put(this,this);}的构造函数中,
这里的问题是键和值是相同的,因此当更新的指示即将到来时,HAshMap 正在收集所有数据并且它从未被 GC'ed。它导致泄漏。
我尝试了解决方法并删除了 static 关键字,它工作正常。但我认为删除 static 会导致一些严重的问题。
有没有其他方法可以纠正这种泄漏。代码重构是不可能的,因为它真的很复杂,而且我的时间不多了。任何人请指导我。提前致谢
【问题讨论】:
-
"m 是一个类的实例变量。" => 不,它是一个静态(或类)变量。使地图静态与否完全没有相同的含义。你需要/想要哪个?为什么?
-
为什么哈希映射中的键和值是相同的?为什么不直接使用
HashSet? -
你能显示你的接口类的代码......你用它作为键吗?
-
@DougRamsey 实际上我不知道他们为什么需要这样。但是现在我必须以任何方式纠正它以解决内存泄漏。您是否建议使用 HashSet 而不是 HashMap?是否需要进行更多更改?
-
好吧,Java 不会“泄漏内存”,所以如果对象没有在压力下释放,那么有人 - 例如HashMap,但可能是另一个集合 - 保持对象强可达。虽然有各种“弱引用”HashMap 等,但它可能只是一个设计问题,即在某些时候(即当它们不再相关/不再使用时)没有正确删除对象。
标签: java memory-management memory-leaks static jvm