簡介
在Java中提供了4個級別的引用:強引用、軟引用、弱引用和虛引用。在這4個引用級別中,只有強引用類FinalReference類是包內(nèi)可見的,其他3種引用類型均為public,可以在引用程序中直接使用。

強引用
Java中通過引用可以對堆中的對象進(jìn)行操作。在某函數(shù)中,當(dāng)創(chuàng)建了一個對象后,該對象被分配在堆中,通過這個對象的引用才能對這個對象進(jìn)行操作。
強引用特點:
- 可以直接訪問目標(biāo)對象。
- 所指向的對象在任何時候都不會被系統(tǒng)回收。JVM寧愿拋出OOM異常,也不會回收強引用所指向的對象。
- 可能導(dǎo)致內(nèi)存泄漏。
軟引用
軟引用是除了強引用外最強的引用類型??梢酝ㄟ^java.lang.ref.SoftReference使用軟引用。
一個持有軟引用的對象不會被JVM很快回收,JVM會根據(jù)當(dāng)前堆的使用情況來判斷何時回收。當(dāng)堆使用頻率臨近閾值時,才會去回收軟引用的對象。只要有足夠的內(nèi)存,軟引用便可以在內(nèi)存中存活相當(dāng)長的一段時間。因此軟引用可以用于對內(nèi)存敏感的Cache.
弱引用
弱引用是一種比軟引用較弱的引用類型。在系統(tǒng)調(diào)用GC時,只要發(fā)現(xiàn)弱引用,不管形同堆空間是否足夠,都會將對象進(jìn)行回收。但是,由于垃圾回收器的線程通常優(yōu)先級很低,因此并不一定能很快發(fā)現(xiàn)弱引用的對象。在這種情況下,軟引用對象可以存在較長的時間。一旦一個弱引用對象被垃圾回收器回收,便會加入一個注冊引用隊列中。
注意
軟引用和弱引用都非常適合用來保存那些可有可無的緩存數(shù)據(jù)。如果這么做,當(dāng)系統(tǒng)內(nèi)存不足時,這些緩存數(shù)據(jù)會被回收,不會導(dǎo)致內(nèi)存溢出。但是當(dāng)內(nèi)存資源充足時,這些緩存數(shù)據(jù)又可以存在相當(dāng)長的時間,從而起到加速系統(tǒng)運行的作用。
虛引用
虛引用是所有引用類型中最弱的一個。一個持有虛引用的對象和沒有引用幾乎是一樣的,它隨時都可能被垃圾回收器回收。當(dāng)試圖通過引用的get()方法取得強引用時,總是會失敗,并且虛引用必須和引用隊列一起使用,其作用在于跟蹤垃圾回收過程。
當(dāng)垃圾回收器準(zhǔn)備回收一個對象時,如果發(fā)現(xiàn)它還有虛引用,就會在垃圾回收后銷毀這個對象時將這個虛引用加入引用隊列。