gpt4 book ai didi

java - 了解关于引用队列的虚引用与弱引用

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:04 25 4
gpt4 key购买 nike

根据链接https://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html , PhantomReferences 仅当对象从内存中物理移除时才会入队,而 WeakReferences 在完成或垃圾回收实际发生之前入队。

The difference is in exactly when the enqueuing happens.WeakReferences are enqueued as soon as the object to which they pointbecomes weakly reachable. This is before finalization or garbagecollection has actually happened; in theory the object could even be"resurrected" by an unorthodox finalize() method, but theWeakReference would remain dead. PhantomReferences are enqueued onlywhen the object is physically removed from memory, and the get()method always returns null specifically to prevent you from being ableto "resurrect" an almost-dead object.

而根据 http://www.ibm.com/developerworks/library/j-refs/ , PhantomReference 在堆对象被释放之前被添加到它的 ReferenceQueue 并且 WeakReferences 在完成或垃圾收集之后被添加到它的 ReferenceQueue。

Unlike soft and weak references, the PhantomReference is added to itsReferenceQueue before the heap object is freed. (Remember, allPhantomReference objects must be created with an associatedReferenceQueue.) This allows for action to be taken before the heapobject is reclaimed.

When the heap object's finalize() method is run and its memory freed,the WeakReference object is added to its ReferenceQueue, if it exists.

我很困惑。哪一个是正确的?

基本上我想知道关于引用队列的弱引用和虚引用之间的区别?

最佳答案

在 ReferenceQueue 上:

WeakReference 和 PhantomReference 都将在其引用对象(被引用对象)不可强访问后入队,如果它们在创建时注册了非空引用队列。

在通过入队之前,WeakReference 清除(无效化)referent 字段,使 referent 完全无法访问。清除 WeakReference 后,应用程序将无法再 get() 引用对象。这意味着,稍后将 WeakReference 入队时,get() 将返回 null。 WeakReference 在创建时可能没有注册引用队列。应用程序可以通过 get()-ing 检测它的引用对象是否不可访问。有时,当应用程序不想显式管理弱引用时,引用队列可以方便地管理它们。

在通过入队之前,PhantomReference 不会清除引用字段。当它入队时,引用对象仍然被 PhantomReference 引用。引用对象仅在应用程序从引用队列中出队后才明确清除。如果应用程序不清除它,则引用对象将保留在那里,直到它和它的 PhantomReference 一起被回收。在任何情况下,PhantomReference 上的 get() 总是返回 null,即使它没有被清除。因此,应用程序无法通过 get()-ing 检测其所指对象是否无法访问。应用程序只能通过检查 PhantomReference 是否排队来检测到这一点。因此,必须在注册引用队列的情况下创建 PhantomReference;否则没用。

关于完成:

当 WeakReference 被清除时,引用对象变得不可访问。如果 referent 有一个非默认的终结器,它就会被终结,因此会被复活。如果 referent 没有非默认终结器,则它可能会被 GC 回收。换句话说,WeakReferences 在终结之前被处理。

如果 PhantomReference 的指示对象只能通过 PhantomReference 访问,则它还不是幻访问的。如果它在完成后仍然如此(只能通过 PhantomReference 可访问),则它只是幻影可及的。换句话说,PhantomReferences 是在 finalization 之后处理的。只有那些没有被终结复活的指涉物是幻影可达的,因此它们肯定会死去。但是从那以后 PhantomReference 将被排队,那些引用对象还没有死。只有当 PhantomReferences 稍后被应用程序清除,或者 PhantomReferences 自身变得不可访问时,它们才会变得可回收(然后 PhantomReference 及其引用一起被回收。)

关于java - 了解关于引用队列的虚引用与弱引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26211657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com