ReferenceQueue中的WeakReferences是否自动从队列中删除?

时间:2013-12-05 17:55:35

标签: java garbage-collection

我知道对于ReferencesQueue中的PhantomReference,必须自己处理和清空ReferenceQueue。

对于ReferenceQueue中的WeakReferences,是否会自动从ReferenceQueue中删除WeakReferences?

我们使用策略作为终结器的替代方案,如下所述: http://resources.ej-technologies.com/jprofiler/help/doc/indexRedirect.html?http&&&resources.ej-technologies.com/jprofiler/help/doc/helptopics/config/finalizers.html

但我们不想让另一个线程从ReferenceQueue中删除PhantomReference。

所以我们使用了WeakReferences,假设它们会自动从ReferenceQueue中删除。这是正确的假设吗?谢谢。

2 个答案:

答案 0 :(得分:1)

弱引用将与它们引用的对象一起进行GC,前提是没有其他对该对象的引用。因此,ReferenceQueue中的弱引用将不会执行您期望它们执行的操作。弱引用不会阻止对象被GC控制,但是一旦它出现,你将无法以与幻像引用相同的方式间接引用它。

说尝试在Websphere上使用弱引用,你会发现垃圾收集器在清除它们时非常积极,无论你喜欢与否。

您需要使用守护程序线程自行清理幻像引用,可能包括某种形式的析构函数。

答案 1 :(得分:1)

是的,你是对的。除非一些糟糕的终结代码复活它们。

这是一篇很好的文章,解释了这种情况:https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html