成因与典型场景
预防与最佳实践
代码示例
import java.lang.ref.WeakReference;
import java.util.*;
class WeakObserverList<T> {
private final List<WeakReference<T>> refs = new ArrayList<>();
public void add(T observer) {
if (observer == null) return;
refs.add(new WeakReference<>(observer));
}
public void remove(T observer) {
refs.removeIf(ref -> ref.get() == null || ref.get() == observer);
}
public void forEach(java.util.function.Consumer<T> action) {
refs.removeIf(ref -> {
T o = ref.get();
if (o == null) return true; // GC 回收后清理
action.accept(o);
return false;
});
}
public int size() { return (int) refs.stream().filter(r -> r.get() != null).count(); }
}
@Override
protected void onDestroy() {
super.onDestroy();
if (observable != null && observer != null) {
observable.deleteObserver(observer); // 或 eventBus.unregister(this);
}
observable = null;
observer = null;
}
import java.util.concurrent.CopyOnWriteArrayList;
class Subject {
private final CopyOnWriteArrayList<Observer> observers = new CopyOnWriteArrayList<>();
void register(Observer o) { if (o != null) observers.addIfAbsent(o); }
void unregister(Observer o) { observers.remove(o); }
void notifyObservers() {
for (Observer o : observers) o.update();
}
}
// 键为弱引用:当 key 不再被强引用持有时,条目可被回收
Map<Key, Value> weakKeyMap = new WeakHashMap<>();
上述做法分别体现了:弱引用避免强引用泄漏、及时注销生命周期、并发安全容器与弱键集合的使用。
排查与定位
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。