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.
}