天天看點

Java的四種引用類型通俗易懂

Java的四種引用類型通俗易懂

⽆論是通過引⽤計數法判斷對象引⽤數量,還是通過可達性分析法判斷對象的引⽤鍊是否可達,判定對象的存活都與“引⽤”有關。

JDK1.2之前,Java中引⽤的定義很傳統:如果reference類型的資料存儲的數值代表的是另⼀塊記憶體的起始位址,就稱這塊記憶體代表⼀個引⽤。

JDK1.2以後,Java對引⽤的概念進⾏了擴充,将引⽤分為強引⽤、軟引⽤、弱引⽤、虛引⽤四種(引⽤強度逐漸減弱)

強引⽤(StrongReference)

以前我們使⽤的⼤部分引⽤實際上都是強引⽤,這是使⽤最普遍的引⽤。

如果⼀個對象具有強引⽤,那就類似于必不可少的⽣活⽤品,垃圾回收器絕不會回收它。

當記憶體空間不⾜,Java虛拟機甯願抛出OutOfMemoryError錯誤,使程式異常終⽌,也不會靠随意回收具有強引⽤的對象來解決記憶體不⾜問題。

軟引⽤(SoftReference)

如果⼀個對象隻具有軟引⽤,那就類似于可有可⽆的⽣活⽤品。如果記憶體空間⾜夠,垃圾回收器就不會回收它,如果記憶體空間不⾜了,就會回收這些對象的記憶體。隻要垃圾回收器沒有回收它,該對象就可以被程式使⽤。軟引⽤可⽤來實作記憶體敏感的⾼速緩存。軟引⽤可以和⼀個引⽤隊列(ReferenceQueue)聯合使⽤,如果軟引⽤所引⽤的對象被垃圾回收,JAVA虛拟機就會把這個軟引⽤加⼊到與之關聯的引⽤隊列中。

弱引⽤(WeakReference)

如果⼀個對象隻具有弱引⽤,那就類似于可有可⽆的⽣活⽤品。弱引⽤與軟引⽤的差別在于:隻具有弱引⽤的對象擁有更短暫的⽣命周期。在垃圾回收器線程掃描它所管轄的記憶體區域的過程中,⼀旦發現了隻具有弱引⽤的對象,不管目前記憶體空間⾜夠與否,都會回收它的記憶體。不過,由于垃圾回收器是⼀個優先級很低的線程, 是以不⼀定會很快發現那些隻具有弱引⽤的對象。弱引⽤可以和⼀個引⽤隊列(ReferenceQueue)聯合使⽤,如果弱引⽤所引⽤的對象被垃圾回收,Java虛拟機就會把這個弱引⽤加⼊到與之關聯的引⽤隊列中。

虛引⽤(PhantomReference)

"虛引⽤"顧名思義,就是形同虛設,與其他⼏種引⽤都不同,虛引⽤并不會決定對象的⽣命周期。如果⼀個對象僅持有虛引⽤,那麼它就和沒有任何引⽤⼀樣,在任何時候都可能被垃圾回收。

虛引⽤主要⽤來跟蹤對象被垃圾回收的活動。虛引⽤與軟引⽤和弱引⽤的⼀個差別在于: 虛引⽤必須和引⽤隊列(ReferenceQueue)聯合使⽤。當垃圾回收器準備回收⼀個對象時,如果發現它還有虛引⽤,就會在回收對象的記憶體之前,把這個虛引⽤加⼊到與之關聯的引⽤隊列中。程式可以通過判斷引⽤隊列中是 否已經加⼊了虛引⽤,來了解被引⽤的對象是否将要被垃圾回收。程式如果發現某個虛引⽤已經被加⼊到引⽤隊列,那麼就可以在所引⽤的對象的記憶體被回收之前采取必要的⾏動。

特别注意,在程式設計中⼀般很少使⽤弱引⽤與虛引⽤,使⽤軟引⽤的情況較多,這是因為軟引⽤可以加速JVM對垃圾記憶體的回收速度,可以維護系統的運⾏安全,防⽌記憶體溢出(OutOfMemory)等問題的産⽣。