【问题标题】:WeakHashMap<Integer, Vector<IConsumer>>, will Vector be collected if only strong reference to IConsumers?WeakHashMap<Integer, Vector<IConsumer>>,如果只强引用IConsumers,Vector会被收集吗?
【发布时间】:2012-01-26 10:31:15
【问题描述】:

我有一个对象Producer,它在内部启动一个线程来侦听一些网络事件,并且大多数时候阻塞receive() 方法。在这个 Producer 对象中,我有一个 WeakHashMap&lt;Integer, Vector&lt;IConsumer&gt;&gt; 包含 at 哈希映射,其中键是 Producer 可以产生的事件,值是已在这些事件上注册的消费者列表。

现在我有一个Main 对象,它构造了一些ManagerManager 构造一个Producer 和任意数量的ConcreteConsumers implements IConsumerManager 包含对 ProducerConcreteConsumers 的引用。

这是一个有效的构造吗,Vector&lt;IConsumer&gt; 在插入 WeakHashMap&lt;Integer, Vector&lt;IConsumer&gt;&gt; 后是否不符合 GC 条件,因为没有对实际向量的引用?仅直接引用ProducerConcreteConsumers。如果是这样,我该如何解决?


接下来发生的事情是Main 对象删除了对Manager 的引用,这应该会导致所有ConcreteConsumers 都符合GC 条件,这正是我想要的。

但是,我还希望实际的Producer 对象有资格进行 GC,并且此时内部线程停止执行。有关如何执行此操作的任何建议?

【问题讨论】:

  • 你的map的key和value类型是什么? - "WeakHashMap 中的 entry 将在其 key 不再正常使用时自动删除。"
  • @HannoBinder:我忘了写hashmap的实际key,它是一个Integer,我更新了问题。

标签: java multithreading garbage-collection weak-references producer-consumer


【解决方案1】:

WeakHashMap 中的键具有弱引用。该值被强引用。在没有对密钥的强引用(在这种情况下为 Integer)之后,该条目将被删除一段时间。那是Integer 的同一个实例,而不仅仅是具有相同值的实例。值类型作为WeakHashMap 的键并不是特别有用。

WeakHashMap 不能用作缓存(你想使用SoftReferences,可能还有其他人的库)。)

【讨论】:

  • "这是 Integer 的同一个实例,而不仅仅是具有相同值的实例。" - 也许应该注意 Java 内部对 Integer 对象的“缓存”,这可能会阻止它们被收集。
  • 感谢您的回答。看来我完全误解了WeakHashMap,因为我以某种方式将文档误读为弱引用保留的值。我用HashMap&lt;Integer, Set&lt;IConsumer&gt;&gt; 替换了地图结构,其中集合由Collections.newSetFromMap(WeakHashMap...) 构造,据我所知,它可以满足我的需求。
猜你喜欢
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2011-08-07
相关资源
最近更新 更多