天天看点

Strong, Soft, Weak, Phantom Reference

Java 对象的状态有:

    * 已创建(created)

    * 强可达(strong reachable)

    * 不可见(invisible)

    * 不可达(unreachable)

    * 已收集(collected)

    * 终化(finalized)

    * 已回收(deallocated)

强引用(strong reference)

软引用(soft reference)

弱引用(weak reference)

虚引用(phantom reference)

强可及对象(strongly reachable):可以通过强引用访问的对象。

软可及对象(softly reachable):不是强可及对象,并且能够通过软引用访问的对象。

弱可及对象(weakly reachable):不是强可及对象也不是软可及对象,并且能够通过弱引用访问的对象。

虚可及对象(phantomly reachable):不是强可及对象、软可及对象,也不是弱可及对象,已经结束的,可以通过虚引用访问的对象。

SoftReference

SoftReference 的原理是:在保持对象引用的同时,保证在 Out of Memory之前将清除所有的软引用。

关键之处在于,垃圾收集器在运行时可能会(也可能不会)释放软可及对象。对象是否被释放取决于垃圾收集器的算法以及垃圾收集器运行时可用的内存数量。 

SoftReference 的一个典型用途就是用于内存敏感的高速缓存。

WeakReference

关键之处在于,垃圾收集器运行时如果碰到了弱可及对象,将释放 WeakReference 引用的对象。然而,请注意,垃圾收集器可能要运行多次才能找到并释放弱可及对象。

PhantomReference

Phantom Reference(幽灵引用) 与 WeakReference 和 SoftReference 有很大的不同,因为它的 get() 方法永远返回 null。

 PhantomReference 只能用于跟踪引用对象即将进行的收集。同样,它还能用于执行 pre-mortem 清除操作。PhantomReference 必须与 ReferenceQueue 一起使用(事实上 WeakReference & SoftReference 也可以有这个参数))。需要 ReferenceQueue 是因为它能够充当通知机制。当垃圾收集器确定了某个对象是虚可及对象时,PhantomReference 对象就被放在它的 ReferenceQueue 上。将 PhantomReference 对象放在 ReferenceQueue 上也就是一个通知,表明 PhantomReference 对象引用的对象已经结束,可供收集了。这使您能够刚好在对象占用的内存被回收之前采取行动。