Java中強、軟、弱、虛四種引用詳解

奈學教育發表於2020-09-03

1.  強引用

  強引用就是指在程式程式碼之中普遍存在的,指建立一個物件並把這個物件賦給一個引用變數,並沒有像其它三種引用一樣有一個就具體的類來描述。對於強引用物件,即使記憶體不足,JVM寧願丟擲OutOfMemoryError (OOM)錯誤也不會回收這種物件。
例如:

Object object =new Object(); String str ="hello";

  如果想中斷強引用和某個物件之間的關聯,可以顯示地將引用賦值為null,這樣一來的話,JVM在合適的時間就會回收該物件。比如各種集合的移除方法。

2. 軟引用

SoftReference< People > aSoftRef=new SoftReference< People >(obj)

  軟引用是用來描述一些還有用但並非必需的物件。只使用SoftReference類修飾的物件就是一個軟引用物件(軟可到達物件),如果一個物件只具有軟引用,記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些物件的記憶體。只要垃圾回收器沒有回收它,該物件就可以被程式使用。
  常常用於快取操作,把某個物件標記為軟引用時,當記憶體足夠就不會回收,記憶體不足就會回收,比如網頁快取,圖片快取等。並且軟引用都會保證在虛擬機器丟擲OutOfMemoryError之前已經被清除。

3.  弱引用

WeakReference< People > reference=new WeakReference< People >(obj);

  弱引用也是用來描述非必需物件的。只使用WeakReference類修飾的物件就是一個弱引用物件(弱可達物件)。弱引用的物件相比軟引用擁有更短暫的生命週期。無論記憶體是否足夠,一旦下次垃圾回收器執行後掃描到弱引用,便會回收。 不過,由於垃圾回收器是一個優先順序很低的執行緒,因此不一定會很快發現那些只具有弱引用的物件。
  Java中有WeakHashMap類,以及THreadLocal中的ThreadLocalMap內部節點Entry,他們都是WeakReference的實現。

4.  虛引用

PhantomReference< People > pr = new PhantomReference< People > (object, ReferenceQueue);

  虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關係,虛引用與軟引用和弱引用的一個區別在於:虛引用必須和引用佇列 (ReferenceQueue)聯合使用。
  無法透過get獲取該引用,但其實虛引用其實是持有物件引用的,只是PhantomReference的get方法的實現永遠返回null。
  先要糾正一種觀點,一個物件被關聯成虛引用,是完全有可能影響其生命週期的,虛引用有潛在的記憶體洩露風險,因為JVM不會自動幫助我們釋放,我們必須要保證它指向的堆物件是不可達的。
  一個物件設定虛引用關聯的唯一目的就是能在這個物件被收集器回收時會被加入到相關引用佇列中,常常被用於管理堆外記憶體的清理,DirectByteBuffer等能夠申請堆外記憶體的物件均與一個虛引用相關聯,當DirectByteBuffer物件被回收時,會被加入到一個引用佇列,此時GC會判斷佇列中的物件,並且對DirectByteBuffer物件申請的堆外記憶體進行清理。

本文來源於: 奈學開發者社群,如有侵權請聯絡我刪除~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2716780/,如需轉載,請註明出處,否則將追究法律責任。

相關文章