Java 強(qiáng)引用 軟引用與弱引用,虛引用區(qū)別

  1. 強(qiáng)引用(StrongReference):
    如果一個(gè)對(duì)象具有強(qiáng)引用,那垃圾回收器絕不會(huì)回收它,當(dāng)內(nèi)存空間不足,Java虛擬機(jī)寧愿拋出OutOfMemoryError錯(cuò)誤,使程序異常終止,也不會(huì)靠隨意回收具有強(qiáng)引用的對(duì)象來(lái)解決內(nèi)存不足的問(wèn)題;
    Object o=new Object(); // 強(qiáng)引用
  2. 軟引用(SoftReference):
    軟引用是用來(lái)描述一些有用但并不是必需的對(duì)象,在Java中用java.lang.ref.SoftReference類來(lái)表示。對(duì)于軟引用關(guān)聯(lián)著的對(duì)象,只有在內(nèi)存不足的時(shí)候JVM才會(huì)回收該對(duì)象。因此,這一點(diǎn)可以很好地用來(lái)解決OOM的問(wèn)題,并且這個(gè)特性很適合用來(lái)實(shí)現(xiàn)緩存:比如網(wǎng)頁(yè)緩存、圖片緩存等。
    軟引用可以和一個(gè)引用隊(duì)列(ReferenceQueue)聯(lián)合使用,如果軟引用所引用的對(duì)象被JVM回收,這個(gè)軟引用就會(huì)被加入到與之關(guān)聯(lián)的引用隊(duì)列中。下面是一個(gè)使用示例:
    SoftReference<String> sr = new SoftReference<String>(new String("hello"));
    System.out.println(sr.get());
  3. 弱引用(WeakReference)
      弱引用也是用來(lái)描述非必需對(duì)象的,當(dāng)JVM進(jìn)行垃圾回收時(shí),無(wú)論內(nèi)存是否充足,都會(huì)回收被弱引用關(guān)聯(lián)的對(duì)象。在java中,用java.lang.ref.WeakReference類來(lái)表示。下面是使用示例:
    WeakReference<String> sr = new WeakReference<String>(new String("hello"));
    System.out.println(sr.get());
    4.虛引用(PhantomReference)
    虛引用和前面的軟引用、弱引用不同,它并不影響對(duì)象的生命周期。在java中用java.lang.ref.PhantomReference類表示。如果一個(gè)對(duì)象與虛引用關(guān)聯(lián),則跟沒(méi)有引用與之關(guān)聯(lián)一樣,在任何時(shí)候都可能被垃圾回收器回收。
    要注意的是,虛引用必須和引用隊(duì)列關(guān)聯(lián)使用,當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。程序可以通過(guò)判斷引用隊(duì)列中是否已經(jīng)加入了虛引用,來(lái)了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)。

引用隊(duì)列(Reference Queue):
一旦弱引用對(duì)象開(kāi)始返回null,該弱引用指向的對(duì)象就被標(biāo)記成了垃圾。而這個(gè)弱引用對(duì)象(非其指向的對(duì)象)就沒(méi)有什么用了。通常這時(shí)候需要進(jìn)行一些清理工作。比如WeakHashMap會(huì)在這時(shí)候移除沒(méi)用的條目來(lái)避免保存無(wú)限制增長(zhǎng)的沒(méi)有意義的弱引用。

引用隊(duì)列可以很容易地實(shí)現(xiàn)跟蹤不需要的引用。當(dāng)你在構(gòu)造WeakReference時(shí)傳入一個(gè)ReferenceQueue對(duì)象,當(dāng)該引用指向的對(duì)象被標(biāo)記為垃圾的時(shí)候,這個(gè)引用對(duì)象會(huì)自動(dòng)地加入到引用隊(duì)列里面。接下來(lái),你就可以在固定的周期,處理傳入的引用隊(duì)列,比如做一些清理工作來(lái)處理這些沒(méi)有用的引用對(duì)象。

參考文章:
http://www.cnblogs.com/dolphin0520/p/3784171.html 基礎(chǔ)篇
https://droidyue.com/blog/2014/10/12/understanding-weakreference-in-java/ 深入理解篇

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容