大部分Java程序猿所不瞭解的引用關係

簡要說明

強引用: new 對象並指向引用變量的都是強引用,開發中大部分都是強引用

軟引用: 在內存個充足情況下,GC不會回收軟引用對象,另外GC遇到軟引用,會用軟引用算法清理

弱引用: 任意GC都會清理掉軟引用對象

虛引用: 和其他三個不一樣,這個不對生命週期,有影響,而是當要回收時候,加入到Queue隊列中


  • 強引用

強引用永遠不會被垃圾回收,JVM寧願拋出OutOfMemory錯誤也不會回收這種對象。

大部分Java程序猿所不瞭解的引用關係

  • 軟引用(SoftReference)

如果一個對象具有軟引用,內存空間足夠,垃圾回收器就不會回收它;

軟引用可用來實現內存敏感的高速緩存,比如網頁緩存、圖片緩存等。使用軟引用能防止內存洩露,增強程序的健壯性。

SoftReference的特點是它的一個實例保存對一個Java對象的軟引用, 該軟引用的存在不妨礙垃圾收集線程對該Java對象的回收。

也就是說,一旦SoftReference保存了對一個Java對象的軟引用後,在垃圾線程對 這個Java對象回收前,SoftReference類所提供的get()方法返回Java對象的強引用。

垃圾收集線程會在虛擬機拋出OutOfMemoryError之前回收軟可及對象

大部分Java程序猿所不瞭解的引用關係

  • 弱引用(WeakReference)

弱引用也是用來描述非必需對象的,當JVM進行垃圾回收時,無論內存是否充足,都會回收被弱引用關聯的對象。在java中,用java.lang.ref.WeakReference類來表示:

不過要注意的是,這裡所說的被弱引用關聯的對象是指只有弱引用與之關聯,如果存在強引用同時與之關聯,則進行垃圾回收時也不會回收該對象(軟引用也是如此)

大部分Java程序猿所不瞭解的引用關係

  • 虛引用(PhantomReference

虛引用和前面的軟引用、弱引用不同,它並不影響對象的生命週期。在java中用java.lang.ref.PhantomReference類表示

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


分享到:


相關文章: