【发布时间】:2012-01-18 12:36:42
【问题描述】:
我正在阅读刚刚被问到的这个问题:Avoid memory leaks in callbacks?
我很困惑,直到有人回答了以下问题:
“这种方法的问题是你不能有一个只在集合中引用的监听器,因为它会随机消失(在下一次 GC 上)”
我的理解是否正确,即使用弱引用(例如存储在 WeakHashMap 中时)与匿名侦听器不兼容?
我通常这样传递监听器:
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)
}
}
我使用 CopyOnWriteArrayList 跟踪听众(上面的默认 Observable 显然使用旧的 Vector 但它只是一个示例展示我通常如何创建一个匿名类来用作侦听器)。
作为一个额外的问题:如果可观察主题使用 WeakHashMap,那么对匿名侦听器的引用何时有资格进行 GC? main 方法何时退出? obs.addObserver 调用一结束?
对于匿名类实例的引用在何处/如何/何时保留/存储/符合 GC 条件,我有点困惑。
很明显,如果我保留一个普通的引用,它就不符合 GC 的条件,但是当它在 WeakHashMap 中时,确切地说侦听器什么时候才符合 GC 的条件?
【问题讨论】:
标签: java callback garbage-collection anonymous-methods