有效的Java说:
内存泄漏的第三个常见来源是听众和其他人 回调。如果您实现客户端注册回调的API 但是不要明确注销它们,否则它们会积累,除非你 采取一些行动。确保回调是垃圾的最佳方法 及时收集的是仅存储对它们的弱引用 例如,通过将它们仅存储为WeakHashMap中的键。
我无法理解这一点。有人可以解释一下吗?
答案 0 :(得分:3)
如果您将回调添加到集合中,但不删除它们,则会导致内存泄漏。处理此问题的一种方法(除了确保始终正确删除此类对象)是将侦听器存储在弱集合中。当该元素/侦听器不再具有强引用时,弱集合可以删除条目。
这种方法的问题是你不能有一个只在集合中引用的监听器,因为它会随机消失(在下一个GC上)
我倾向于使用未在其他任何地方引用的侦听器,并尝试确保正确删除未使用的侦听器。
答案 1 :(得分:1)
保持对对象的弱引用不会阻止它被垃圾收集 - 如果没有对该对象的更强引用,最终它将被垃圾收集,您将无法再通过{{访问它1}}你已经存储了。 Google WeakReference
了解更多信息。
答案 2 :(得分:1)
这意味着:如果一个监听器或回调引用了对象本身,那么引用的对象永远不会被GC,因为监听器或回调仍然存在,并且存在对该对象的引用,导致内存泄漏。