Java 避免回调中的内存泄漏?

Java 避免回调中的内存泄漏?,java,Java,可能重复: 有效的Java说: 第三个常见的内存泄漏源是侦听器和其他 回调。如果您实现了一个客户端注册回调的API 但不要明确取消注册,除非您 采取一些行动。确保回调是垃圾的最佳方法 及时收集是为了存储对它们的弱引用,例如 例如,只将它们作为密钥存储在WeakHashMap中 我无法理解这一点。有人能解释一下吗?持有对某个对象的弱引用并不能阻止它被垃圾收集-如果不再有对该对象的强引用,最终它将被垃圾收集,您将无法再通过存储的WeakReference访问它。GoogleJava弱引用教程了解更

可能重复:

有效的Java说:

第三个常见的内存泄漏源是侦听器和其他 回调。如果您实现了一个客户端注册回调的API 但不要明确取消注册,除非您 采取一些行动。确保回调是垃圾的最佳方法 及时收集是为了存储对它们的弱引用,例如 例如,只将它们作为密钥存储在WeakHashMap中


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

持有对某个对象的弱引用并不能阻止它被垃圾收集-如果不再有对该对象的强引用,最终它将被垃圾收集,您将无法再通过存储的
WeakReference
访问它。Google
Java弱引用教程
了解更多信息。

这意味着:如果侦听器或回调引用了对象本身,那么引用的对象将永远不会被GCed,因为侦听器或回调仍然存在,并且有一个来自此对象的引用,从而导致内存泄漏

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

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


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

这里回答了这个问题。