Java 为什么我的实例被垃圾收集
我有下面的类层次结构。出于某种原因,我的侦听器会被垃圾收集,即使我保持对它的强引用Java 为什么我的实例被垃圾收集,java,memory-management,garbage-collection,weak-references,strong-references,Java,Memory Management,Garbage Collection,Weak References,Strong References,我有下面的类层次结构。出于某种原因,我的侦听器会被垃圾收集,即使我保持对它的强引用 class MyModule { MySubModule submodule = null; MyModule(Channel ch) { submodule = new MySubModule(ch); } } class MySubModule { MyListener listener = null; MySubModule(Channel ch) {
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);
}
}
}
如果仍然有对MyModule的强引用,MyListener不可能被垃圾收集 要么您没有正确设置子模块,要么您没有正确设置侦听器,要么您从未将侦听器添加到后端WeakHashMap(我猜这是最有可能的) 你们怎么知道听者是垃圾收集的?您可能会检查它是否存在于后端WeakHashMap中。它不在那里,所以你声称它是gc'ed。但实际上它从未被添加到它中。如果正确的话,请告诉我
首先检查您是否真的对模块和子模块有很强的引用。如果有,则检查子模块是否具有对MyListener的有效引用。如果仍然具有对MyModule的强引用,则MyListener不可能被垃圾回收 要么您没有正确设置子模块,要么您没有正确设置侦听器,要么您从未将侦听器添加到后端WeakHashMap(我猜这是最有可能的) 你们怎么知道听者是垃圾收集的?您可能会检查它是否存在于后端WeakHashMap中。它不在那里,所以你声称它是gc'ed。但实际上它从未被添加到它中。如果正确的话,请告诉我
首先检查您是否真的对模块和子模块有很强的引用。如果有,请检查子模块是否有对MyListener的有效引用。请显示更多源代码。您是否保留对MyModule或MySubModule实例的强引用?我与您的反馈人员一起编辑了这个问题。ThanksHow您知道侦听器是垃圾收集的吗?我定期在另一个线程打印侦听器的大小。最终,它一直下降到0。请显示更多源代码。您是否保留对MyModule或MySubModule实例的强引用?我与您的反馈人员一起编辑了这个问题。ThanksHow您知道侦听器是垃圾收集的吗?我定期在另一个线程打印侦听器的大小。最终,它会一直下降到0。
static void main(...) {
Channel ch = new Channel();
MyModule myModule = new MyModule(ch);
// do some real stuff here.
}