Java中的引用
Java中的引用分为四种:强引用、软引用、弱引用以及幻象引用。每种引用都有其独特的特性和使用场景。
一、强引用
强引用是我们最常见的普通对象引用,只要强引用还存在,垃圾收集器永远不会回收被引用的对象。
Object obj = new Object(); // obj为强引用
如果一个对象由强引用关联,即使该对象已无用处,Java也不会进行垃圉回收,这就是"强引用"。强引用可能会导致内存泄露。
二、软引用
软引用是一种相对弱化的引用,需要使用java.lang.ref.SoftReference类来实现。被软引用关联的对象只有在内存不足时才会被回收。
SoftReference
相比强引用,软引用关联的对象具有“可有可无”的特性,非常适合用在缓存中。
三、弱引用
弱引用是比软引用还要弱化的引用,需要使用java.lang.ref.WeakReference类来实现。只要垃圾收集器线程发现这类对象,不论当前内存情况如何,都会回收其所关联的对象。
WeakReference
一般来说,弱引用关联的对象只能生存到下一次垃圾回收前。这样的特性使得弱引用适合做短暂引用的场景,如Java的HashMap等。
四、幻象引用
幻象引用是Java中最弱的引用类型,需要使用java.lang.ref.PhantomReference类来实现。对于一个普通的对象,如果仅存在幻象引用,则完全等同于无引用。
PhantomReference
到了这个级别,引用关联的对象无论任何情况都会被回收。幻象引用主要用来跟踪对象被垃圾回收的状态,不能单独使用并需要配合引用队列进行使用。