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 對象引用的對象已經結束,可供收集了。這使您能夠剛好在對象占用的記憶體被回收之前采取行動。