【发布时间】:2020-08-31 14:41:18
【问题描述】:
我不确定从长远来看这是否会给我带来一些内存泄漏问题,我想知道在这种情况下使用弱引用是否有什么不同:
public abstract class ChangeObserver<X extends SomeClass> {
X someClass;
public ChangeObserver(X someClass) {
this.someClass= someClass;
}
public void notifySomeClass(
) {
onChanged().onChanged(someClass);
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
这会导致程序生命周期出现问题吗?它会通过使用弱引用来解决吗?
感谢@Hulk 和@tashkhisi,我提供了这个解决方案,如果有什么遗漏,请不要犹豫,立即纠正。
public abstract class ChangeObserver<X extends SomeClass> {
private WeakReference<X> someClassWeakRef;
private OnDataChanged<X> observer;
public ChangeObserver(X someClass) {
this.someClassWeakRef = new WeakReference<>(someClass);
observer = onChanged();
}
public void notifySomeClass(
) {
observer.onChanged(someClassWeakRef.get());
}
public abstract OnDataChanged<X> onChanged();
@FunctionalInterface
public interface OnDataChanged<X> {
void onChanged(X x);
}
}
我仍然缺少的是这个 removeObserver() 方法究竟应该做什么来删除观察者,如果我要使用避免内存泄漏的特定方法,它只是简单地设置观察者 = null ?
提前致谢。
【问题讨论】:
-
您预计会有什么样的泄漏?您认为哪个参考资料会变成
WeakReference-someClass? -
onChanged()(第一个)到底是什么? -
嗨@Hulk,感谢您的关注,如果这个对象的封闭类被破坏,这个对象中对SomeClass的引用不会阻止整个封闭类获得GC吗? onChanged()(第一个)是接口的构造/初始化的抽象方法调用。
-
引用
someClass可以使引用的对象保持活动状态,但如果从ChangeObserver派生的对象不再从其他任何地方引用,则此引用不会改变其生命周期。即使有循环引用——大多数 Java GC 实现都可以很好地处理循环,只要不再有来自“外部”的引用。 -
无论哪种方式,我担心这个问题有点太模糊,无法明确回答 - 我们需要一个具体的使用场景,包括观察者和被观察者等。这可能会很多要阅读的代码;-) 我建议您尝试一下,可能通过分析器运行它以监控 GC 并查看是否真的存在问题。
标签: java memory-leaks lifecycle weak-references