【问题标题】:Avoid memory leaks in callbacks? [duplicate]避免回调中的内存泄漏? [复制]
【发布时间】:2011-12-12 13:48:24
【问题描述】:

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

Effective Java 说:

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

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

【问题讨论】:

标签: java


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    持有一个对象的弱引用并不能阻止它被垃圾回收 - 如果没有更多对该对象的强引用,最终它将被垃圾回收,您将无法再通过 @987654321 访问它@您已存储。谷歌Java weak references tutorial了解更多信息。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-08
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多