了解与参考队列相关的Phantom参考与弱参考

Ana*_*and 4 java garbage-collection weak-references phantom-reference soft-references

根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html,只有当对象从内存中物理移除并且WeakReferences在最终化或垃圾收集之前排队时才会加入PhantomReferences实际发生了.

区别在于排队发生的时间.WeakReferences在它们指向的对象变得无法访问时立即排队.这是在最终确定或垃圾收集实际发生之前; 理论上,对象甚至可以通过非正统的finalize()方法"复活",但WeakReference仍然会死亡.只有在从内存中物理移除对象时,才会将PhantomReferences排队,并且get()方法始终返回null,以防止您"复活"几乎死亡的对象.

而根据http://www.ibm.com/developerworks/library/j-refs/,在释放堆对象之前将PhantomReference添加到其ReferenceQueue中,并在完成或垃圾回收后将WeakReferences添加到其ReferenceQueue.

与软引用和弱引用不同,PhantomReference在释放堆对象之前会添加到其ReferenceQueue中.(请记住,必须使用关联的ReferenceQueue创建所有PhantomReference对象.)这允许在回收堆对象之前采取操作.

当运行堆对象的finalize()方法并释放其内存时,WeakReference对象将添加到其ReferenceQueue(如果存在).

我很迷惑.哪一个是正确的?

基本上我想知道关于Reference Queue的弱引用和幻像引用之间的区别?

Xia*_* Li 6

在ReferenceQueue上:

WeakReference和PhantomReference都将在它们的引用对象(引用对象)不可强制到达后排队,如果它们在创建时已注册非空引用队列.

在为入队传递之前,WeakReference清除(取消)引用字段以使引用完全无法访问.当WeakReference被清除时,应用程序不能再获得()指示对象.这意味着,当稍后WeakReference入队时,get()返回null.WeakReference可能没有在创建时注册的引用队列.应用程序可以通过get()来检测它的指示对象是否无法访问.有时,当应用程序不想显式管理WeakReferences时,引用队列很方便管理WeakReferences.

在为入队传递之前,PhantomReference不会清除引用字段.当它入队时,PhantomReference仍会引用所指对象.只有在引用队列出列后,应用程序才会明确清除引用对象.如果应用程序没有清除它,那么指示物仍然存在,直到它和它的PhantomReference一起被回收.在任何情况下,PhantomReference上的get()总是返回null,即使它没有被清除.因此,应用程序无法通过get()来检测它的指示对象是否无法访问.应用程序只能通过检查PhantomReference是否排队来检测.因此,必须使用已注册的引用队列创建PhantomReference; 否则,它没用.

最终确定:

当WeakReference被清除时,指示对象变得无法访问.如果指示物具有非默认的终结器,则它将被完成,因此将被复活.如果指示物没有非默认的终结器,则它可以由GC回收.换句话说,在完成之前处理WeakReferences.

如果PhantomReference的指示对象只能通过PhantomReference访问,那么它还没有幻像可达.如果在完成后仍然如此(只能通过PhantomReference访问),则只能进行幻象可达.换句话说,PhantomReferences在完成后处理.只有那些没有通过最终确定而复活的指称物是幻影可达的,因此它们肯定会死亡.但是从那时起PhantomReference将被排队,那些指称对象尚未死亡.它们只有在应用程序稍后清除PhantomReferences时才会变为可回收,或者PhantomReferences自身无法访问(然后PhantomReference及其指示对象一起被回收.)