我在晚上7:41进行了Java堆转储,我正在使用Eclipse内存分析工具进行分析。堆转储包括20个会话对象。
在我的堆中的其中一个会话对象上使用Path to GC Roots命令显示以下3个对会话对象的引用。
当会话对象仍然具有强引用和弱引用时,它如何在终结器队列上?
在剩余的19个会话对象中,还有1个在终结器队列中,并且具有类似的弱引用。所有其他18个会话对象仅被弱引用。为什么GC没有清除这些弱的参考?
一些要点:
答案 0 :(得分:10)
我认为你在这里犯的错误就是这个部分:
Finalizer线程拥有的“未完成”链接列表的终结器引用。我的目标是排在第3位。
如果你在谈论这个:
static private Finalizer unfinalized = null;
在Sun的Finalizer.java
(Finalizer
包含next
和prev
Finalizer
,因此是“链接列表”部分,适用于在家中玩的人),那不是最终确定的事项清单。
Finalizer.add()
不是(我认为你在假设)。相反,该方法在对象的创建时间调用(例如在<init>
期间,由本机代码调用,用于覆盖finalize()
的任何对象。
next
链中存在终结器并不意味着它即将完成;
static private ReferenceQueue queue
持有这样的对象。在链表中只是意味着它 一个finalize()
方法。
因此,你的第一点是红鲱鱼,这是你的第二点保持物品可达,第三点从第二点流出(因为在物体可到达时不会清除WeakReference
)。
希望这有帮助!
答案 1 :(得分:0)
弱参考仅是GC的指示。当它被清除时,你没有任何硬性保证。
答案 2 :(得分:0)
您可以再次安排最终确定的对象。
我知道:
会话对象 没有终结者可以 复活它,即使它做到了 不能跑的时候 对象仍处于未完成状态 在其他对象后面排队。
然而,可能有其他对象这样做(即已经参加会议并获得自己的rez'd)。无论哪种方式都显示该会话的终结者。
注意:在清除幻像之前,对象将无法完成。 (幻像引用最常用于安排预先验证清除操作, javadoc ),pre(不像弱文章那样发布)。