Java GC是否通过在分配给该引用的ReferenceQueue上放置弱引用来原子清除弱引用?换句话说,如果对WeakReference.get()的调用返回null,那么WeakReference会在队列中吗?
答案 0 :(得分:3)
让我们解析WeakReference的Javadoc:
假设垃圾收集器确定某个点 一个对象弱可达的时间。
那时它会原子地清除对此的所有弱引用 对象和对任何其他弱可达对象的所有弱引用 从那个强大而柔软的链条可以到达那个物体 引用。
与此同时,它将宣布所有以前的弱可达性 对象可以最终确定。
同时或稍后 将那些已注册的新清除的弱引用排入队列 参考队列。
看起来步骤如下:
确定对象是否可以弱到达。
从WeakReference
清除该对象。 WeakReference.get
将返回null
。
将该对象标记为可终结。
在其他时间之后或者将其排队
WeakReference
进入队列(如果WeakReference
创建了
一个队列)。
这意味着即使WeakReference.get()
返回null
,也不能保证WeakReference.enqueue
将true
或ReferenceQueue.poll
不会返回{{1} }。
有关详情,请参阅https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references。
参考队列
一旦WeakReference开始返回null,它指向的对象 已经成为垃圾,而WeakReference对象也是如此 无用。这通常意味着某种清理工作 例如,WeakHashMap必须删除此类已解散的条目 避免持有越来越多的deadWeakReferences。
ReferenceQueue类可以轻松跟踪死亡情况 引用。如果您将ReferenceQueue传递给弱引用 构造函数,引用对象将自动插入 引用它的对象成为引用队列 垃圾。然后,您可以按照一定的时间间隔处理 ReferenceQueue并执行死亡所需的任何清理工作 引用。
示例代码显示:
null
答案 1 :(得分:0)
Java GC是否通过在分配给该引用的ReferenceQueue上放置弱引用来原子地清除弱引用?
没有。排队'at the same time or some later time'。该规范没有任何原子性。
换句话说,如果对
WeakReference.get()
的调用返回null,WeakReference
是否会在队列中?
不一定。请注意,这根本不是“换句话说”:它不是同一个问题。