最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹

 更新時(shí)間:2014年04月17日 08:51:19   作者:  
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念

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

Java中弱引用VS軟引用

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

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

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

復(fù)制代碼 代碼如下:

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

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

復(fù)制代碼 代碼如下:

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)都被封裝成弱引用,也就是說一旦強(qiáng)引用被刪除,WeakHashMap內(nèi)部的弱引用就無法阻止該對(duì)象被垃圾回收器回收。

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

復(fù)制代碼 代碼如下:

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ì)象,而虛引用無法阻止垃圾回收器回收對(duì)象。

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

復(fù)制代碼 代碼如下:

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);

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

 

這就是Java中弱引用和軟引用的區(qū)別。我們還學(xué)到了一些基本的引用類:弱引用、軟引用、虛引用以及WeakHashMap和WeakHashMap??傊侠淼氖褂靡每梢詭椭厥掌鞲玫墓芾鞪ava內(nèi)存。

相關(guān)文章

  • java中各種類型用Stream流求最大值最小值方式

    java中各種類型用Stream流求最大值最小值方式

    這篇文章主要介紹了java中各種類型用Stream流求最大值最小值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)

    spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)

    這篇文章主要介紹了spring boot教程之產(chǎn)生的背景及其優(yōu)勢(shì)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • Java 基礎(chǔ):string中的compareTo方法

    Java 基礎(chǔ):string中的compareTo方法

    這篇文章主要介紹了Java 基礎(chǔ):string中的compareTo方法,文章圍繞string中的compareTo方法的相關(guān)資料展開文章詳細(xì)內(nèi)容,希望對(duì)待大家有所幫助
    2021-12-12
  • Spring成為Java開發(fā)的標(biāo)準(zhǔn)以及SpringBoot如何徹底改變開發(fā)體驗(yàn)

    Spring成為Java開發(fā)的標(biāo)準(zhǔn)以及SpringBoot如何徹底改變開發(fā)體驗(yàn)

    本文深入剖析了Spring框架及其在Java企業(yè)級(jí)應(yīng)用開發(fā)中的地位,強(qiáng)調(diào)了Spring通過IoC容器、AOP和模塊化生態(tài)系統(tǒng)等核心特性,解決了一系列傳統(tǒng)JavaEE開發(fā)的痛點(diǎn),本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • springSecurity過濾web請(qǐng)求的項(xiàng)目實(shí)踐

    springSecurity過濾web請(qǐng)求的項(xiàng)目實(shí)踐

    SpringSecurity是一個(gè)功能強(qiáng)大的安全框架,提供了全面的 Web 安全功能,它的核心之一是過濾器鏈,用于攔截和處理 Web 請(qǐng)求,本文就來介紹SpringSecurity配置和使用過濾器來管理Web請(qǐng)求的安全性,感興趣的可以了解一下
    2025-09-09
  • Kafka消費(fèi)客戶端協(xié)調(diào)器GroupCoordinator詳解

    Kafka消費(fèi)客戶端協(xié)調(diào)器GroupCoordinator詳解

    這篇文章主要為大家介紹了Kafka消費(fèi)客戶端協(xié)調(diào)器GroupCoordinator使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • java二維數(shù)組遍歷的2種代碼

    java二維數(shù)組遍歷的2種代碼

    這篇文章主要介紹了java二維數(shù)組遍歷的2種代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot的@Value注解如何設(shè)置默認(rèn)值

    SpringBoot的@Value注解如何設(shè)置默認(rèn)值

    這篇文章主要介紹了SpringBoot的@Value注解如何設(shè)置默認(rèn)值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • mybatis plus in方法使用詳解

    mybatis plus in方法使用詳解

    這篇文章主要介紹了mybatis plus in方法使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot整合spring-retry實(shí)現(xiàn)接口請(qǐng)求重試機(jī)制及注意事項(xiàng)

    SpringBoot整合spring-retry實(shí)現(xiàn)接口請(qǐng)求重試機(jī)制及注意事項(xiàng)

    今天通過本文給大家介紹我們應(yīng)該如何使用SpringBoot來整合spring-retry組件實(shí)現(xiàn)重試機(jī)制及注意事項(xiàng),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-08-08

最新評(píng)論

乌苏市| 宣汉县| 澄江县| 大姚县| 托里县| 平和县| 芜湖市| 武平县| 渭南市| 丽水市| 邢台县| 申扎县| 叙永县| 望奎县| 常宁市| 商丘市| 准格尔旗| 滕州市| 龙陵县| 玛沁县| 视频| 广昌县| 牡丹江市| 绥棱县| 平度市| 双桥区| 澜沧| 宝鸡市| 康保县| 伽师县| 新蔡县| 额尔古纳市| 济源市| 板桥市| 武城县| 新乐市| 汨罗市| 衡水市| 巴彦县| 玛纳斯县| 左贡县|