Java中的四种类型的引用
Java中的4种类型的引用
Java中一共有4种类型的引用:StrongReference、SoftReference、WeakReference以及 PhantomReference (幽灵引用)。
- Strong Reference
StrongReference 是 Java 的默认引用实现,它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时Java GC 执行后将会被回收
- SoftReference
SoftReference 所引用的对象在JVM内部不再有强引用时会被回收(虚拟机保证), 但会尽可能长的保留引用直到 JVM 内存不足时才会回收,这一特性使得 SoftReference 非常适合缓存应用
- WeakReference
WeakReference 当所引用的对象在 JVM 内不再有强引用时, weak reference 将会被自动回收
- PhantomReference
Phantom Reference(幽灵引用) 与 WeakReference 和 SoftReference 有很大的不同,因为它的 get() 方法永远返回 null, 这也正是它名字的由来
诸位可能要问, 一个永远返回 null 的 reference 要来何用,请注意构造 PhantomReference 时的第二个参数 ReferenceQueue(事实上 WeakReference & SoftReference 也可以有这个参数),PhantomReference 唯一的用处就是跟踪 referent何时被 enqueue 到 ReferenceQueue 中.
对比
Strong Reference | An ordinary reference. Keeps objects alive as long as they are referenced. | normal reference. | Any object not pointed to can be reclaimed. | default |
Soft Reference | Keeps objects alive provided there’s enough memory. | to keep objects alive even after clients have removed their references (memory-sensitive caches), in case clients start asking for them again by key. | After a first gc pass, the JVM decides it still needs to reclaim more space. | java.lang.ref. SoftReference |
Weak Reference | Keeps objects alive only while they’re in use (reachable) by clients. | Containers that automatically delete objects no longer in use. | After gc determines the object is only weakly reachable |
java.lang.ref.
WeakReference
java.util. WeakHashMap |
Phantom Reference | Lets you clean up after finalization but before the space is reclaimed (replaces or augments the use offinalize ()) | Special clean up processing | After finalization. | java.lang.ref. PhantomReference |