四種類型的引用

從Java SE2開始,就提供了四種類型的引用:強引用、軟引用、弱引用和虛引用。

Java中提供這四種引用類型主要有兩個目的:第一是可以讓程序員通過代碼的方式決定某些對象的生命週期;第二是有利於JVM進行垃圾回收。

1、強引用

平時開發new對象都屬於強引用

只要某個對象有強引用與之關聯,JVM必定不會回收這個對象,即使在內存不足的情況下,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。

如果想中斷強引用和某個對象之間的關聯,可以顯示地將引用賦值爲null,這樣一來的話,JVM在合適的時間就會回收該對象。

  比如Vector類的clear方法中就是通過將引用賦值爲null來實現清理工作的:
  
這裏寫圖片描述

2、軟引用

有用但不必須 SoftReference

與軟引用關聯着的對象,只有在內存不足的時候JVM纔會回收該對象。因此,這一點可以很好地用來解決OOM的問題,並且這個特性很適合用來實現緩存:比如網頁緩存、圖片緩存等。

  軟引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果軟引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。

應用場景:假如有一個應用需要讀取大量的本地圖片,如果每次讀取圖片都從硬盤讀取,則會嚴重影響性能,但是如果全部加載到內存當中,又有可能造成內存溢出,此時使用軟引用可以解決這個問題。

3、弱引用

弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。

在java中,用java.lang.ref.WeakReference類來表示。
弱引用可以和一個引用隊列(ReferenceQueue)聯合使用,如果弱引用所引用的對象被JVM回收,這個軟引用就會被加入到與之關聯的引用隊列中。

這裏寫圖片描述

執行後顯示:

Hello
Null

4、虛引用

PhantomReference

不影響對象的生命週期,
如果一個對象與虛引用關聯,則跟沒有引用與之關聯一樣,在任何時候都可能被垃圾回收器回收。

虛引用必須和引用隊列關聯使用,當垃圾回收器準備回收一個對象時,如果發現它還有虛引用,就會把這個虛引用加入到與之 關聯的引用隊列中。程序可以通過判斷引用隊列中是否已經加入了虛引用,來了解被引用的對象是否將要被垃圾回收。如果程序發現某個虛引用已經被加入到引用隊列,那麼就可以在所引用的對象的內存被回收之前採取必要的行動。

發佈了222 篇原創文章 · 獲贊 287 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章