PhantomReference
一、总结
1.jdk 1.8.0
2.定义
虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个持有虚引用的对象,和没有引用几乎是一样的,随时都有可能被垃圾回收器回收。当试图通过虚引用的get()方法取得强引用时,总是会失败。并且,虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。
二、源码分析
/*
* Copyright (c) 1997, 2003, Oracle and/or its affiliates. All rights reserved.
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*/
package java.lang.ref;
/**
* Phantom reference objects, which are enqueued after the collector
* determines that their referents may otherwise be reclaimed. Phantom
* references are most often used for scheduling pre-mortem cleanup actions in
* a more flexible way than is possible with the Java finalization mechanism.
*
* <p> If the garbage collector determines at a certain point in time that the
* referent of a phantom reference is <a
* href="package-summary.html#reachability">phantom reachable</a>, then at that
* time or at some later time it will enqueue the reference.
*
* <p> In order to ensure that a reclaimable object remains so, the referent of
* a phantom reference may not be retrieved: The <code>get</code> method of a
* phantom reference always returns <code>null</code>.
*
* <p> Unlike soft and weak references, phantom references are not
* automatically cleared by the garbage collector as they are enqueued. An
* object that is reachable via phantom references will remain so until all
* such references are cleared or themselves become unreachable.
*
* @author Mark Reinhold
* @since 1.2
*/
public class PhantomReference<T> extends Reference<T> {
/**
* Returns this reference object's referent. Because the referent of a
* phantom reference is always inaccessible, this method always returns
* <code>null</code>.
*
* @return <code>null</code>
*/
public T get() {
return null;
}
/**
* Creates a new phantom reference that refers to the given object and
* is registered with the given queue.
*
* <p> It is possible to create a phantom reference with a <tt>null</tt>
* queue, but such a reference is completely useless: Its <tt>get</tt>
* method will always return null and, since it does not have a queue, it
* will never be enqueued.
*
* @param referent the object the new phantom reference will refer to
* @param q the queue with which the reference is to be registered,
* or <tt>null</tt> if registration is not required
*/
public PhantomReference(T referent, ReferenceQueue<? super T> q) {
super(referent, q);
}
}
分享到:
相关推荐
PhantomReference<Bean> phantom = new PhantomReference(new Bean("name", 10), queue); System.gc(); // 强制执行垃圾回收 System.out.println(phantom.get()); // null FinalReference 是一个特殊的引用类型,它...
周期无法控制可以采用SoftReference,WeakReference,PhantomReference这三种对象来执行(看了Ibatis的缓存机制才发现JDK居然还提供了PhantomReference这玩意儿,得恶补基础啊),这三种都是弱引用,区别在于强度...
- 示例:`PhantomReference<String> phantomRef = new PhantomReference(new String("PhantomReference Test"), new ReferenceQueue());` 理解这四种引用类型有助于开发者在设计和实现复杂系统时,更好地控制对象...
PhantomReference<String> phantomRef = new PhantomReference(new String("hello"), referenceQueue); ``` 在`java.lang.ref`包中,有三个类分别对应这四种引用:`SoftReference`、`WeakReference`和`...
本文将深入探讨这个包中的四种主要引用类型:StrongReference、SoftReference、WeakReference 和 PhantomReference,以及它们的特性、用法和作用。 首先,强引用(StrongReference)是我们在日常编程中最常见的引用...
PhantomReference<String> phantomReference = new PhantomReference(str, queue); str = null; // 断开强引用 System.gc(); // 请求GC // GC执行后,虚引用指向的对象已经被回收 // 通过ReferenceQueue检查虚...
- 示例:`PhantomReference pr = new PhantomReference(new String("hello"), queue);` - 通常用于管理堆外内存,如 DirectByteBuffer,当对象将被回收时,可以做一些额外的清理工作。 ThreadLocal 工作原理: - ...
- 使用** Cleaner / PhantomReference**:对于更复杂的情况,可以使用Cleaner或者PhantomReference来实现更精细的资源清理,但这种方式比直接使用try-finally更复杂,一般只在必要时使用。 5. Java 9及以后版本的...
相比之下,`PhantomReference`配合引用队列可以更精确地控制资源的释放时机。 六、资源池 对于昂贵的资源,如数据库连接,通常使用连接池进行管理。连接池预先创建并维护一定数量的连接,供程序需要时复用,使用...
创建虚引用的代码示例:`PhantomReference<Object> pf = new PhantomReference(obj);` 理解这四种引用类型对于进行JVM调优至关重要,因为它们可以帮助我们控制对象的生命周期,防止内存泄漏,以及优化内存使用效率...
SoftReference、WeakReference和PhantomReference分析和比较 在 Java 中,引用类型分为强引用、软引用、弱引用和虚引用四种。强引用是我们最常用的引用类型,而软引用、弱引用和虚引用则是 Java 为我们提供的三种...
- **例子**:` PhantomReference<Object> phantomRef = new PhantomReference(new Object(), new ReferenceQueue());` - **特点**:虚引用主要用来跟踪对象被垃圾收集的状态,通常不用于内存管理。 了解和正确...
- 示例:`PhantomReference<String> phantomRef = new PhantomReference(new String("Hello"), new ReferenceQueue());` 这些引用类型的使用需要根据具体需求来选择。例如,软引用常用于缓存策略,以保持一定数量...
PhantomReference<String> phantomRef = new PhantomReference(str, queue); if (queue.poll() == null) { System.out.println("phantom reference is still valid."); } else { System.out.println("phantom ...
Java从1.2版本开始引入了四种引用,分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。这四种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用...
然而,为了更细致地控制对象的生命周期,Java提供了一套特殊的引用类型,即弱引用(WeakReference)、软引用(SoftReference)和虚引用(PhantomReference),以及引用队列(ReferenceQueue)的概念,这些都定义在...
在Java的lang.ref包中,提供了SoftReference类、WeakReference类和PhantomReference类来分别代表软引用、弱引用和虚引用。此外,ReferenceQueue类表示引用队列,可以与这三种引用类联合使用,用于跟踪垃圾回收器回收...
Java中的四种引用类型是Java内存管理的重要组成部分,它们分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。每种引用类型具有不同的特点和用途,...
PhantomReference<Bitmap> phantomRef = new PhantomReference(bitmap, referenceQueue); ``` 在这个例子中,`referenceQueue`是一个预先创建好的引用队列。当垃圾回收器准备回收`bitmap`时,会将`phantomRef`放入`...