日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍

發(fā)布時(shí)間:2025/3/20 java 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

知道弱引用和軟引用的概念與如何使用它們是兩碼事,引用類(lèi)在垃圾回收工作的過(guò)程中有重要作用。我們都知道垃圾回收器會(huì)回收符合回收條件的對(duì)象的內(nèi)存,但并不是所有的程序員都知道回收條件取決于指向該對(duì)象的引用類(lèi)型。這正是Java中弱引用和軟引用的主要區(qū)別。如果一個(gè)對(duì)象只有弱引用指向它,垃圾回收器會(huì)立即回收該對(duì)象,這是一種急切回收方式。相對(duì)的,如果有軟引用指向這些對(duì)象,則只有在JVM需要內(nèi)存時(shí)才回收這些對(duì)象。弱引用和軟引用的特殊行為使得它們?cè)谀承┣闆r下非常有用。例如:軟引用可以很好的用來(lái)實(shí)現(xiàn)緩存,當(dāng)JVM需要內(nèi)存時(shí),垃圾回收器就會(huì)回收這些只有被軟引用指向的對(duì)象。而弱引用非常適合存儲(chǔ)元數(shù)據(jù),例如:存儲(chǔ)ClassLoader引用。如果沒(méi)有類(lèi)被加載,那么也沒(méi)有指向ClassLoader的引用。一旦上一次的強(qiáng)引用被去除,只有弱引用的ClassLoader就會(huì)被回收。這篇文章中我們將講述不同類(lèi)型的Java引用,例如:強(qiáng)引用(Strong Reference)和虛引用(PhantomReference)。

Java中弱引用VS軟引用

Java中有如下四種類(lèi)型的引用:

1.強(qiáng)引用(Strong Reference)

2.弱引用(WeakReference)

3.軟引用(SoftReference)

4.虛引用(PhantomReference)

強(qiáng)引用是我們?cè)诰幊踢^(guò)程中使用的最簡(jiǎn)單的引用,如代碼String s=”abc”中變量s就是字符串對(duì)象”abc”的一個(gè)強(qiáng)引用。任何被強(qiáng)引用指向的對(duì)象都不能被垃圾回收器回收,這些對(duì)象都是在程序中需要的。弱引用使用java.lang.ref.WeakReference class 類(lèi)來(lái)表示,你可以使用如下代碼創(chuàng)建弱引用:

Counter counter = new Counter(); // strong reference - line 1

WeakReference weakCounter = new WeakReference(counter); //weak reference

counter = null; // now Counter object is eligible for garbage collection

現(xiàn)在只要你給強(qiáng)引用對(duì)象counter賦空值null,該對(duì)象就可以被垃圾回收器回收。因?yàn)樵搶?duì)象此時(shí)不再含有其他強(qiáng)引用,即使指向該對(duì)象的弱引用weakCounter也無(wú)法阻止垃圾回收器對(duì)該對(duì)象的回收。相反的,如果該對(duì)象含有軟引用,Counter對(duì)象不會(huì)立即被回收,除非JVM需要內(nèi)存。Java中的軟引用使用java.lang.ref.SoftReference類(lèi)來(lái)表示,你可以使用如下代碼創(chuàng)建軟引用:

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

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

虛引用是java.lang.ref package包中第三種可用的引用,使用java.lang.ref.PhantomReference類(lèi)來(lái)表示。擁有虛引用的對(duì)象可以在任何時(shí)候被垃圾回收器回收。和弱引用和軟引用相似,你可以通過(guò)如下代碼創(chuàng)建虛引用:

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;

一旦移除強(qiáng)引用,第三行的DigitalCounter對(duì)象可以在任何時(shí)候被垃圾回收器回收。因?yàn)橹挥幸粋€(gè)虛引用指向該對(duì)象,而虛引用無(wú)法阻止垃圾回收器回收對(duì)象。

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

ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup

DigitalCounter digit = new DigitalCounter();

PhantomReference phantom = new PhantomReference(digit, refQueue);

引用實(shí)例被添加在引用隊(duì)列中,你可以再任何時(shí)候通過(guò)查詢引用隊(duì)列回收對(duì)象。一個(gè)對(duì)象的生命周期可以通過(guò)下圖進(jìn)行描述:這就是Java中弱引用和軟引用的區(qū)別。我們還學(xué)到了一些基本的引用類(lèi):弱引用、軟引用、虛引用以及WeakHashMap和WeakHashMap。總之,合理的使用引用可以幫助垃圾回收器更好的管理Java內(nèi)存。

總結(jié)

以上是生活随笔為你收集整理的java 软引用_Java中弱引用和软引用的区别以及虚引用和强引用介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。