激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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內存。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九热在线免费观看视频 | 日韩精品中文字幕在线观看 | 在线播放污 | 精品无吗乱吗av国产爱色 | 国产美女的小嫩bbb图片 | 久久亚洲成人 | 久久电影一区二区 | 毛片在线视频观看 | 精品国内视频 | 免费在线一区二区 | 精品亚洲夜色av98在线观看 | 一区二区三区欧美在线 | 99精品国产小情侣高潮露脸在线 | 色播视频在线播放 | 激情久久免费视频 | 国产寡妇xxxxxxxx性开放 | 看免费一级毛片 | 亚洲网站一区 | 欧美一区二区三区免费不卡 | 国产在线免 | 久久思思爱 | 九九热这里只有精品8 | h视频在线免费观看 | 亚洲一区二区三区视频 | 欧洲精品久久久久69精品 | 久久金品| 成年性羞羞视频免费观看无限 | 久久久久久久久久久久久久av | 蜜桃视频观看麻豆 | 欧美精品在线视频观看 | 精品99在线视频 | 免费久久精品 | 在线视频欧美一区 | 欧美激情综合在线 | 日韩黄色片免费看 | 欧美成a人片在线观看久 | 国产大片在线观看 | 麻豆视频观看 | 久久精品无码一区二区三区 | 九九视屏 | 欧美性生活久久久 |