我正在阅读刚刚被问到的这个问题:避免回调中的内存泄漏? https://stackoverflow.com/questions/8475314
我很困惑,直到有人回答了以下问题:
“这种方法的问题是你不能拥有一个仅在集合中引用的侦听器,因为它会随机消失(在下一次 GC 上)”
我的理解是否正确,即使用弱引用,例如存储在弱哈希映射,与匿名监听器不兼容?
我通常这样传递听众:
public static void main(String[] args) {
final Observable obs = new SomeObservable();
obs.addObserver(new Observer() {
public void update(final Observable o, final Object arg) {
System.out.println("Notified");
}
});
obs.notifyObservers();
... // program continues its life here
}
private static final class SomeObservable extends Observable {
@Override
public void addObserver(final Observer o) {
super.addObserver(o);
setChanged(); // shouldn't be done from here (unrelated to the question)
}
}
我用一个来跟踪听众写入数组列表时复制(默认可观察的上面显然使用了旧的Vector但这只是一个示例,展示我通常如何创建一个匿名类来用作侦听器)。
作为一个额外的问题:如果可观察主题使用 WeakHashMap,对匿名侦听器的引用何时有资格进行 GC?当。。。的时候main方法退出?一旦obs.addObserver通话结束?
我对匿名类实例的引用在哪里/如何/何时保留/存储/适合 GC 有点困惑。
显然,如果我保留一个普通引用,它就没有资格进行 GC,但是当它在 WeakHashMap 中时,什么时候会发生呢?恰恰听众是否有资格获得 GC?
是的,你是对的,一个用弱引用维护监听器的可监听类(就像 WeakHashMap 一样)需要它们独立的持久性。可用于侦听器具有子级和父级的侦听器层次结构。
对于非 WeakReference 用法,必须调用显式的removeListener。除非侦听器对象可以与可侦听对象一样长。在大多数用例中,这很好,匿名类就可以了。
使用匿名类实例leak(GC 预防)可能仅在访问时发生final类体之外的对象。
注意:WeakHashMap i.a.对 Map.Entry 自己的子类使用弱引用。有时这可能令人难以置信。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)