1. 程式人生 > >強引用、弱引用和軟引用

強引用、弱引用和軟引用

  轉載請註明地址:http://blog.csdn.net/yincheng886337/article/details/50479459

談到這四種引用,先讓我做個這樣的比喻,JVM好比你,記憶體好比你的抽屜,你日常生活中必需品好比強引用,日常生活中可能用到的東西(即非必需品)好比軟引用或弱引用。當你的抽屜還很空的時候,放些可能以後會用到的東西,你也不會在意。但隨著你買了很多生活必需品時,但你的抽屜已放不下了且你又沒有其他空間可以存放它們,這時你就會將根據一些重要程度選擇一些東西扔出抽屜,這個過程就好比JVM垃圾回收,JVM在記憶體不緊張的時候,存放些軟引用或弱引用所引用的物件以備後續使用,當記憶體緊張時就對它們進行清理。

或許這樣的解釋你還是有點迷茫,下面就舉例說明,以彰“清白”:

//強引用strongRef

String strongRef = new String("good good study,day day up!");  

// 引用佇列referenceQueue    

ReferenceQueue<String> referenceQueue = new ReferenceQueue<String>();

//弱引用weakReference,且與引用佇列關聯

WeakReference<String> weakReference = new    WeakReference<String>(strongRef,referenceQueue);

//strongRef = null;  步驟1

//System.gc();      步驟2 

String weakTest = weakReference.get();

System.out.println(" weakTest->>" + weakTest);

System.out.println(" referenceQueue->>" + referenceQueue.poll());

     

執行結果:

遮蔽步驟1和步驟2

開啟步驟1和步驟2

 weakTest->>good good study,day day up!

 referenceQueue->>null

weakTest->>null 

referenceQueue->>[email protected]

通過上述表述與例項,相信大家對前三種引用具有非常清晰的認知(虛引用使用很少,暫不詳述),現對其總結如圖1和圖2:


   圖1.java四種引用說明


圖2.java四種引用的回收區別

使用建議:

1.如果網頁在瀏覽結束時就進行內容的回收,則按後退檢視前面瀏覽過的頁面時需要重新構建;若將瀏覽過的網頁儲存到記憶體會造成記憶體的大量浪費甚至發生OOM現象,此時就可以使用SoftReference;

2.對Android開發者,針對具有生命跡象的物件如ActivityService等,可考慮使用WeakReference,能有效避免沒必要的洩露;

如需瞭解強軟弱引用的相關內容可參考:

2.http://itlab.idcquan.com/Java/oop/716371_3.html