天天看點

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

  1. 強引用

      強引用就是指在程式代碼之中普遍存在的,指建立一個對象并把這個對象賦給一個引用變量,并沒有像其它三種引用一樣有一個就具體的類來描述。對于強引用對象,即使記憶體不足,JVM甯願抛出OutOfMemoryError (OOM)錯誤也不會回收這種對象。

例如:

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

  如果想中斷強引用和某個對象之間的關聯,可以顯示地将引用指派為null,這樣一來的話,JVM在合适的時間就會回收該對象。比如各種集合的移除方法。

  1. 軟引用

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

  軟引用是用來描述一些還有用但并非必需的對象。隻使用SoftReference類修飾的對象就是一個軟引用對象(軟可到達對象),如果一個對象隻具有軟引用,記憶體空間足夠,垃圾回收器就不會回收它;如果記憶體空間不足了,就會回收這些對象的記憶體。隻要垃圾回收器沒有回收它,該對象就可以被程式使用。

  常常用于緩存操作,把某個對象标記為軟引用時,當記憶體足夠就不會回收,記憶體不足就會回收,比如網頁緩存,圖檔緩存等。并且軟引用都會保證在虛拟機抛出OutOfMemoryError之前已經被清除。

  1. 弱引用

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

  弱引用也是用來描述非必需對象的。隻使用WeakReference類修飾的對象就是一個弱引用對象(弱可達對象)。弱引用的對象相比軟引用擁有更短暫的生命周期。無論記憶體是否足夠,一旦下次垃圾回收器運作後掃描到弱引用,便會回收。 不過,由于垃圾回收器是一個優先級很低的線程,是以不一定會很快發現那些隻具有弱引用的對象。

  Java中有WeakHashMap類,以及THreadLocal中的ThreadLocalMap内部節點Entry,他們都是WeakReference的實作。

  1. 虛引用

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

  虛引用也稱為幽靈引用或者幻影引用,它是最弱的一種引用關系,虛引用與軟引用和弱引用的一個差別在于:虛引用必須和引用隊列 (ReferenceQueue)聯合使用。

  無法通過get擷取該引用,但其實虛引用其實是持有對象引用的,隻是PhantomReference的get方法的實作永遠傳回null。

  先要糾正一種觀點,一個對象被關聯成虛引用,是完全有可能影響其生命周期的,虛引用有潛在的記憶體洩露風險,因為JVM不會自動幫助我們釋放,我們必須要保證它指向的堆對象是不可達的。

  一個對象設定虛引用關聯的唯一目的就是能在這個對象被收集器回收時會被加入到相關引用隊列中,常常被用于管理堆外記憶體的清理,DirectByteBuffer等能夠申請堆外記憶體的對象均與一個虛引用相關聯,當DirectByteBuffer對象被回收時,會被加入到一個引用隊列,此時GC會判斷隊列中的對象,并且對DirectByteBuffer對象申請的堆外記憶體進行清理。

本文來源于:奈學開發者社群,如有侵權請聯系我删除~