避免回调中的内存泄漏?

时间:2011-12-12 13:48:24

标签: java

  

可能重复:
  How to avoid memory leaks in callback?

有效的Java说:

  

内存泄漏的第三个常见来源是听众和其他人   回调。如果您实现客户端注册回调的API   但是不要明确注销它们,否则它们会积累,除非你   采取一些行动。确保回调是垃圾的最佳方法   及时收集的是仅存储对它们的弱引用   例如,通过将它们仅存储为WeakHashMap中的键。

我无法理解这一点。有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

如果您将回调添加到集合中,但不删除它们,则会导致内存泄漏。处理此问题的一种方法(除了确保始终正确删除此类对象)是将侦听器存储在弱集合中。当该元素/侦听器不再具有强引用时,弱集合可以删除条目。

这种方法的问题是你不能有一个只在集合中引用的监听器,因为它会随机消失(在下一个GC上)

我倾向于使用未在其他任何地方引用的侦听器,并尝试确保正确删除未使用的侦听器。

答案 1 :(得分:1)

保持对对象的弱引用不会阻止它被垃圾收集 - 如果没有对该对象的更强引用,最终它将被垃圾收集,您将无法再通过{{访问它1}}你已经存储了。 Google WeakReference了解更多信息。

答案 2 :(得分:1)

这意味着:如果一个监听器或回调引用了对象本身,那么引用的对象永远不会被GC,因为监听器或回调仍然存在,并且存在对该对象的引用,导致内存泄漏。