【发布时间】:2019-03-18 07:02:41
【问题描述】:
我正在尝试将WeakHashMap 用作弱引用的并发Set。
this.subscribers =
Collections.synchronizedSet(
Collections.newSetFromMap(
new WeakHashMap <>()
)
);
当一个元素进入垃圾收集时,我的集合继续将它作为集合的一部分进行报告。因此,地图似乎在不断增长。
文档说:
当一个键被丢弃时,它的条目实际上从映射中删除,...
但实际情况似乎并非如此。
WeakHashMap 是否有清除碎屑的时候?
【问题讨论】:
-
“当一个元素进入垃圾回收站时,我的集合继续将它作为集合的一部分进行报告” - 你如何确定这一点?
-
@user2357112 我打电话给
Set::size()。 -
“这个结果是一个快照,可能不会反映未处理的条目,因为它们不再被引用,所以在下次尝试访问之前将被删除。”
-
另外,您如何确定这些对象已被垃圾回收?
-
@user2357112 事实上,我一定是错误地假设对象是垃圾收集的。请参阅我发布的答案,其中包含一个小实验,表明
Set报告它的大小下降是由于调用Set::remove还是由于成为垃圾。我将不得不更彻底地探索我的原始代码问题。
标签: java garbage-collection weakhashmap