java如何避免回调中的内存泄漏?
有效的Java说:
A third common source of memory leaks is listeners and other callbacks. If you implement an API where clients register callbacks but don’t deregister them explicitly, they will accumulate unless you take some action. The best way to ensure that callbacks are garbage collected promptly is to store only weak references to them, for instance, by storing them only as keys in a WeakHashMap.
我是Java的初学者。有人能教我如何在回调中创建弱引用,并告诉我如何解决内存泄漏问题吗?谢谢
# 1 楼答案
在这里,你可以找到一个清晰而实用的解释: Memory leaks in Android — identify, treat and avoid
# 2 楼答案
用一个快速(粗略)的例子来说明这个概念,考虑如下:
如果客户端类随后使用这个
FileMonitor
API,它们可能会这样做:如果
MyClass
的作者在处理完该处理程序后忘记调用unregisterChangeHandler()
,则FileMonitor
的HashSet
将永远引用已注册的实例,导致它保留在内存中,直到FileMonitor
被销毁或应用程序退出为了防止这种情况发生,Bloch建议使用弱引用集合而不是
HashSet
,这样,如果MyClass
的实例被销毁,引用将从监视器的集合中删除可以用^{} 替换
FileMonitor
中的HashSet
,并将处理程序用作键,因为当对对象的所有其他引用都消失时,后者将自动从集合中删除处理程序# 3 楼答案
阅读this文章
关键的收获是:
接下来是WeakListModel列表,我将不发布该列表,以避免混淆此响应