一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中弱引用和軟引用的區別以及虛引用和強引用介紹

Java中弱引用和軟引用的區別以及虛引用和強引用介紹

2019-11-19 14:36java教程網 JAVA教程

很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個概念

知道弱引用和軟引用的概念與如何使用它們是兩碼事,引用類在垃圾回收工作的過程中有重要作用。我們都知道垃圾回收器會回收符合回收條件的對象的內存,但并不是所有的程序員都知道回收條件取決于指向該對象的引用類型。這正是Java中弱引用和軟引用的主要區別。如果一個對象只有弱引用指向它,垃圾回收器會立即回收該對象,這是一種急切回收方式。相對的,如果有軟引用指向這些對象,則只有在JVM需要內存時才回收這些對象。弱引用和軟引用的特殊行為使得它們在某些情況下非常有用。例如:軟引用可以很好的用來實現緩存,當JVM需要內存時,垃圾回收器就會回收這些只有被軟引用指向的對象。而弱引用非常適合存儲元數據,例如:存儲ClassLoader引用。如果沒有類被加載,那么也沒有指向ClassLoader的引用。一旦上一次的強引用被去除,只有弱引用的ClassLoader就會被回收。這篇文章中我們將講述不同類型的Java引用,例如:強引用(Strong Reference)和虛引用(PhantomReference)。

Java中弱引用VS軟引用

Java中有如下四種類型的引用:

1.強引用(Strong Reference)
2.弱引用(WeakReference)
3.軟引用(SoftReference)
4.虛引用(PhantomReference)

強引用是我們在編程過程中使用的最簡單的引用,如代碼String s=”abc”中變量s就是字符串對象”abc”的一個強引用。任何被強引用指向的對象都不能被垃圾回收器回收,這些對象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class 類來表示,你可以使用如下代碼創建弱引用:

 

復制代碼代碼如下:

Counter counter = new Counter(); // strong reference - line 1
WeakReference<Counter> weakCounter = new WeakReference<Counter>(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection

 

現在只要你給強引用對象counter賦空值null,該對象就可以被垃圾回收器回收。因為該對象此時不再含有其他強引用,即使指向該對象的弱引用weakCounter也無法阻止垃圾回收器對該對象的回收。相反的,如果該對象含有軟引用,Counter對象不會立即被回收,除非JVM需要內存。Java中的軟引用使用java.lang.ref.SoftReference類來表示,你可以使用如下代碼創建軟引用:

 

復制代碼代碼如下:

Counter prime = new Counter(); // prime holds a strong reference – line 2
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object created at line 2

prime = null; // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory

 

強引用置空之后,代碼的第二行為對象Counter創建了一個軟引用,該引用同樣不能阻止垃圾回收器回收對象,但是可以延遲回收,與弱引用中急切回收對象不同。鑒于軟引用和弱引用的這一區別,軟引用更適用于緩存機制,而弱引用更適用于存貯元數據。另一個使用弱引用的例子是WeakHashMap,它是除HashMap和TreeMap之外,Map接口的另一種實現。WeakHashMap有一個特點:map中的鍵值(keys)都被封裝成弱引用,也就是說一旦強引用被刪除,WeakHashMap內部的弱引用就無法阻止該對象被垃圾回收器回收。

虛引用是java.lang.ref package包中第三種可用的引用,使用java.lang.ref.PhantomReference類來表示。擁有虛引用的對象可以在任何時候被垃圾回收器回收。和弱引用和軟引用相似,你可以通過如下代碼創建虛引用:

復制代碼代碼如下:

DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference – line 3
PhantomReference phantom = new PhantomReference(digit); // phantom reference to object created at line 3

digit = null;

 

一旦移除強引用,第三行的DigitalCounter對象可以在任何時候被垃圾回收器回收。因為只有一個虛引用指向該對象,而虛引用無法阻止垃圾回收器回收對象。

除了了解弱引用、軟引用、虛引用和WeakHashMap,還需要了解ReferenceQueue。在創建任何弱引用、軟引用和虛引用的過程中你可以通過如下代碼提供引用隊列ReferenceQueue:

 

復制代碼代碼如下:

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference<DigitalCounter> phantom = new PhantomReference<DigitalCounter>(digit, refQueue);

 

引用實例被添加在引用隊列中,你可以再任何時候通過查詢引用隊列回收對象。一個對象的生命周期可以通過下圖進行描述:


Java中弱引用和軟引用的區別以及虛引用和強引用介紹

 

這就是Java中弱引用和軟引用的區別。我們還學到了一些基本的引用類:弱引用、軟引用、虛引用以及WeakHashMap和WeakHashMap。總之,合理的使用引用可以幫助垃圾回收器更好的管理Java內存。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草青草视频2免费观看 | vod国产成人精品视频 | 女教师系列三上悠亚在线观看 | 亚洲天堂男人 | 视频免费观看在线播放高清 | 1769亚洲资源站365在线 | 水多多www视频在线观看高清 | 午夜在线a亚洲v天堂网2019 | 四色6677最新永久网站 | 人人爱天天做夜夜爽88 | 亚洲精品视频观看 | 狠狠干2017| 亚洲一区二区三区免费视频 | 福利视频一区二区思瑞 | 大陆性出航 | 好紧好爽范冰冰系列 | 办公室恋情在线 | 欧美白人猛性xxxxx69交 | caoporen97免费公开视频 | 波多野结衣中文字幕在线 | 动态图啪啪120秒免费看 | 动漫美女强行被吸乳做羞羞事 | 婷婷久久综合九色综合九七 | 日韩一级免费毛片 | s0e一923春菜花在线播放 | 视频在线观看高清免费看 | 四虎影视4hutv最新地址在线 | 美女模特被c免费视频 | 双性小说肉 | 亚洲爱v| 国产盗摄美女嘘嘘视频 | 公妇乱淫在线播放免费观看 | 色天天综合色天天碰 | 免费在线观看日韩 | 男人亚洲天堂 | 欧美sq| 欧美午夜精品 | 无码乱人伦一区二区亚洲一 | 大学生初次破苞免费视频 | 国产精品日韩欧美在线 | 国产在线视频在线观看 |