我想用粗体理解下面的陈述。这是什么意思? (Link)
现在必须确定覆盖
http://website.com/yiiapp/web
的对象 垃圾在至少两个单独的垃圾收集周期中才能实现 被收集。当第一个循环确定它是垃圾时,它 有资格完成定稿。因为(苗条,但是 不幸的是真实的)对象被复活的可能性" 在最终确定期间,垃圾收集器必须在之前再次运行 实际上可以删除对象。 因为最终确定可能没有 及时发生了,任意数量的垃圾 在对象等待时可能发生了收集周期 定稿。这可能意味着实际清理工作严重延误 垃圾对象,这就是为什么你甚至可以获得finalize()
的原因 大部分堆都是垃圾。
什么是幻影解决方案
使用PhantomReference,这种情况是不可能的 - 当PhantomReference时 排队,绝对没有办法获得指向现在死对象的指针(这很好,因为它不再在内存中)。 因为PhantomReference不能用于复活对象,所以对象可以 在第一个垃圾收集周期中立即清理,在这个周期中,它被发现可以轻易到达。
请帮助我理解问题&解决方案
由于
答案 0 :(得分:1)
与流行的看法相反,finalize
方法在关联对象被垃圾收集时不被触发,而是当它们的关联对象被垃圾收集但是存在时他们的非默认finalize
方法。实际上,对象实际上不能被垃圾收集,直到系统100%确定不存在对它们的引用永远,但运行finalize
方法的行为会创建一个强大的根引用有问题的对象至少会在方法退出之前存在。如果在执行finalize
期间对对象的引用存储在其他位置,则该引用可能会无限期地继续存在。因此,在finalized
方法运行之后,不会收集其中将调用其finalize
方法的对象,也不会收集此类对象拥有直接或间接强引用的任何其他对象。下一个GC循环确认不再存在对该对象的引用。
PhantomReference
类用于封装不同的范例:而不是保持一个对象存活,以便系统可以通知它它已被放弃,并且它仍然活着的唯一原因是它可以接收放弃的通知,需要清理的对象应该创建帮助对象来处理放弃的通知。如果辅助对象避免保留对任何外部对象的引用,那么它们的存在就不会干扰其父对象的集合或父母持有的其他对象直接或间接引用。辅助对象通常不会保留足够的信息让他们做很多事情,但这样做很好,因为他们不应该做太多事情。相反,他们的设计应该专注于执行他们的父母被遗弃时所需的清理工作。