gpt4 book ai didi

java - 为什么我的实例被垃圾收集

转载 作者:太空宇宙 更新时间:2023-11-04 07:22:20 31 4
gpt4 key购买 nike

我有以下类层次结构。由于某种原因,即使我保持对它的强引用,我的监听器也会被垃圾收集。

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。但实际上它从未被添加到其中。让我知道这是否正确。

首先检查您是否确实对 Module 和 SubModule 有强引用。如果有,请检查 SubModule 是否具有对 MyListener 的有效引用。

关于java - 为什么我的实例被垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19124190/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com