[英]why is my instance garbage collected
我有下面的类层次结构。 出于某种原因,即使我对其进行了严格的引用,我的侦听器也会收集垃圾。
class MyModule {
MySubModule submodule = null;
MyModule(Channel ch) {
submodule = new MySubModule(ch);
}
}
class MySubModule {
MyListener listener = null;
MySubModule(Channel ch) {
listener = new MyListener();
ch.subscribe(listener);
}
}
class Channel {
Map<MyListener, Boolean> backend = new WeakHashMap<MyListener, Boolean>();
Set<MyListener> listeners = Collections.newSetFromMap(backend);
void subscribe(MyListener listener) {
listeners.add(listener);
}
void fireListeners() {
// listeners get garbage collected so they won't get fired
for (MyListener listener:listeners) {
listener.observe(someEvt);
}
}
}
Channel类在WeakHashSet中维护一组侦听器。 因此,我在MySubModule中注册了侦听器,并在同一类(变量侦听器)中对其进行了强有力的引用。 但是,JVM仍会垃圾收集侦听器实例。 一旦强烈引用它,它不应该留在WeakHashSet中吗? 在那种情况下,我真的相信我上面有一个。 有人可以告诉我我在这里做什么错吗?
编辑:我也添加了Channel的实现。 同样在main(...)方法中,我有以下内容:
static void main(...) {
Channel ch = new Channel();
MyModule myModule = new MyModule(ch);
// do some real stuff here.
}
如果您仍然强烈引用MyModule,则MyListener不可能被垃圾回收。
您可能未正确设置子模块,或者未正确设置侦听器,或者从未将侦听器添加到后端WeakHashMap(我猜这是最可能的)。
您甚至如何知道监听器已被垃圾回收? 您可能会检查后端WeakHashMap中是否存在它。 它不在那里,所以您声称它已经被gc'ed了。 但实际上,它从未被添加。 让我知道是否正确。
首先检查您是否真的对Module和SubModule有很强的引用。 如果有,请检查SubModule是否具有对MyListener的有效引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.