2011-12-12 80 views
7

可能重复:
How to avoid memory leaks in callback?避免回调中的内存泄漏?

有效的Java说:

内存泄漏的第三个常见原因是监听器和其他 回调。如果您实现了一个客户端注册回调 的API但不明确取消注册,那么它们将会累积,除非您的 采取某些措施。确保回调是垃圾 的最好方法是只存储对它们的弱引用,对于 实例,只将它们作为键存储在WeakHashMap中。

我无法理解这一点。有人能解释这一点吗?

+0

这个问题在这里回答。 http://stackoverflow.com/questions/2859464/how-to-avoid-memory-leaks-in-callback –

回答

1

对对象持有一个弱引用并不妨碍它被垃圾收集 - 如果没有更强的对象引用,最终它将被垃圾收集,您将不能再通过WeakReference访问它你已经存储了。谷歌Java weak references tutorial欲了解更多信息。

1

这意味着:如果对象本身监听器或回调引用,则引用的对象永远不会GCed因为听众或回调仍然存在并有从该对象的引用,从而导致内存泄漏。

3

如果将回调添加到集合但不删除它们,则会导致内存泄漏。处理这种情况的一种方式(除了确保这些对象总是被正确删除之外)就是将听众存储在一个弱集合中。当元素/侦听器不再具有强引用时,弱集合可以删除条目。

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

我倾向于使用未提及其他地方听众和尝试以确保未使用的侦听器被正确删除。