繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM