根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html,只有当对象从内存中物理移除并且WeakReferences在最终确定或垃圾收集之前入队时, PhantomReferences才会入队实际发生了。
不同之处在于排队发生的确切时间。一旦弱引用指向的对象变得弱可达,弱引用就会被排队。这是在最终确定或垃圾收集实际发生之前;理论上,对象甚至可以通过非正统的 finalize() 方法“复活”,但 WeakReference 将保持死态。仅当对象从内存中物理删除时,PhantomReferences 才会入队,并且 get() 方法始终返回 null 专门用于防止您能够“复活”几乎死掉的对象。
而根据http://www.ibm.com/developerworks/library/j-refs/,在释放堆对象之前将PhantomReference添加到其ReferenceQueue中,并且在完成或垃圾回收之后将WeakReferences添加到其 ReferenceQueue 中。
与软引用和弱引用不同,PhantomReference 在堆对象被释放之前被添加到它的 ReferenceQueue 中。(请记住,所有 PhantomReference 对象都必须使用关联的 ReferenceQueue 创建。)这允许在回收堆对象之前采取行动。
当堆对象的 finalize() 方法运行并释放其内存时,WeakReference 对象将添加到其 ReferenceQueue(如果存在)。
我很困惑。哪一个是正确的?
基本上我想知道关于引用队列的弱引用和幻像引用之间的区别?