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

四種引用類型在JAVA Springboot中的使用詳解

 更新時間:2021年12月06日 08:49:28   作者:Java4ye  
這篇文章主要介紹了springboot的四種引用類型,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

概念介紹

不同的引用類型,主要體現(xiàn)的是對象不同的可達(dá)性(reachable)狀態(tài)和對垃圾收集的影響。

01.??強引用

這個就是我們創(chuàng)建的普通對象了~ 當(dāng)該對象被顯示地賦值為?null?時,或者沒有被其他存活的對象繼續(xù)引用時,它就會成為垃圾收集器的目標(biāo),等待被收回

02.??軟引用

軟引用(?SoftReference?) , 當(dāng)內(nèi)存不足?時會被回收

比如

image-20210620220531336

被回收后,這里會打印?null?而不是?Java4ye

03.??弱引用

弱引用(?WeakReference?) , 當(dāng)?垃圾回收器?進(jìn)行垃圾回收時,無論內(nèi)存足與否,它都會被垃圾回收器回收

比如

image-20210620221353830

被回收后,這里也是會打印?null?而不是?Java4ye

04.??虛引用

虛引用(?ReferenceQueue?) , 這個也是隨時會被回收,不過它的作用更像一個標(biāo)記,當(dāng)對象被回收時,它不為?null?,但是要注意,無論什么時候去調(diào)用 虛引用的?get?方法,都只能獲取到一個?null?值。

為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一個系統(tǒng)通知 ——?<<深入理解Java虛擬機>>

這里引用 http://www.javashuo.com/article/p-zyvdcbhl-nb.html 該文章的例子

User user = new User(1, "Java4ye");
ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();
// 創(chuàng)建User對象的虛引用
PhantomReference<User> phantomReference = new PhantomReference<>(user, userReferenceQueue);
// 去掉強引用
user = null;
System.out.println(phantomReference.get());
// 手動觸發(fā)GC
System.gc();
System.out.println("GC: " + phantomReference.get());
Reference<? extends User> reference = null;
try {
    reference = userReferenceQueue.remove(1000);
} catch (InterruptedException e) {
    e.printStackTrace();
}
if (reference != null) {
    System.out.println("對象User被回收了:");
}

對象可達(dá)性

那么 簡單介紹完上面的?4?種引用后,我們再來看看它的可達(dá)性~

如圖~

image-20210621083333189

  • 強可達(dá): 比如 創(chuàng)建一個對象時,創(chuàng)建它的線程對該對象就是強可達(dá)
  • 軟可達(dá): 只能通過軟引用訪問
  • 弱可達(dá): 只能通過弱引用訪問
  • 虛可達(dá): 當(dāng)對象沒有?強,軟,弱?引用關(guān)聯(lián)時,并且?finalize?過,就會進(jìn)入該狀態(tài)
  • 不可達(dá): 意味著該對象可以被清除了。

通過最開始的代碼例子和上面的圖(雙向箭頭)我們還可以發(fā)現(xiàn),軟引用和弱引用和強引用這三者間可以進(jìn)行轉(zhuǎn)換( 通過?Reference?的?get()?可獲取到原對象),這意味著:

對于軟引用、弱引用之類,垃圾收集器可能會存在二次確認(rèn)的問題,以保證處于弱引用狀態(tài)的對象,沒有改變?yōu)閺娨谩?/p>

在?JDK8?中,還可以通過 指定參數(shù)打印引用的相關(guān)信息

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintReferenceGC

?JDK8?中使用?ParrallelGC?收集的垃圾回收日志 (大佬 pdf 中的例子)

0.403: [GC (Allocation Failure) 0.871: [SoftReference, 0 refs, 0.0000393 secs]0.871: [WeakReference, 8 refs, 0.0000138 secs]0.871: [FinalReference, 4 refs, 0.0000094 secs]0.871:

[PhantomReference, 0 refs, 0 refs, 0.0000085 secs]0.871: [JNI Weak Reference, 0.0000071 secs][PSYoungGen: 76272K->10720K(141824K)] 128286K->128422K(316928K), 0.4683919 secs] [Times:

user=1.17 sys=0.03, real=0.47 secs]

再記錄下這個點??

通過底層API來達(dá)到強引用??

image-20210621085544098

Springboot源碼中的使用

嘿嘿 終于來到重點了 ,正如開頭提到的~?4ye?也是在?Springboot?源碼中看到這個

ConcurrentReferenceHashMap?才想起要寫一下這篇文章滴?

那么這個?ConcurrentReferenceHashMap?到底有什么作用呢?

ConcurrentReferenceHashMap?能指定所存放對象的引用級別

默認(rèn)情況下是?軟引用級別

image-20210621122940290

比如 在 Springboot自動裝配原理探索 一文中提到的?Springboot SPI 機制?其中的主角:?SpringFactoriesLoader

源碼如下:

image-20210621092032074

還有自動配置過程中的注解掃描?AnnotationsScanner

image-20210621093124042

以及在 萬字長文,帶你快速上手這些池化技術(shù)! 一文中出現(xiàn)的?異步任務(wù)線程池?ThreadPoolTaskExecutor

源碼如下:?(可以看到這里指明了是?弱引用級別)

image-20210621092723147

總結(jié)

看完上面的例子,覺得可以模仿下?Springboot?的?ConcurrentReferenceHashMap?,對對象進(jìn)行一個合理的存儲,間接地優(yōu)化jvm?,提高垃圾回收的效率。這兩個別搞混了:?軟引用,內(nèi)存不足時回收;弱引用,在進(jìn)行垃圾回收時,不管內(nèi)存足與否,都會被回收

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • 詳解Java中KMP算法的圖解與實現(xiàn)

    詳解Java中KMP算法的圖解與實現(xiàn)

    KMP算法是一種神奇的字符串匹配算法,在對超長字符串進(jìn)行模板匹配的時候比暴力匹配法的效率會高不少。本文將利用圖解為大家詳細(xì)講解KMP算法的實現(xiàn),需要的可以參考一下
    2022-05-05
  • JavaWeb如何實現(xiàn)統(tǒng)一查詢接口(jfinal)

    JavaWeb如何實現(xiàn)統(tǒng)一查詢接口(jfinal)

    這篇文章主要介紹了JavaWeb如何實現(xiàn)統(tǒng)一查詢接口(jfinal),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • spring boot入門開始你的第一個應(yīng)用

    spring boot入門開始你的第一個應(yīng)用

    這篇文章主要介紹了spring boot入門開始你的第一個應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,,需要的朋友可以參考下
    2019-06-06
  • Java中自定義泛型方法及其應(yīng)用示例代碼

    Java中自定義泛型方法及其應(yīng)用示例代碼

    泛型方法是Java中一個強大的特性,它允許我們在方法級別使用類型參數(shù),提高代碼的復(fù)用性和類型安全性,通過本文,讀者可以學(xué)習(xí)如何定義和使用泛型方法,并了解其在處理集合、比較對象、創(chuàng)建實例等任務(wù)中的應(yīng)用,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot Starter機制及整合tomcat的實現(xiàn)詳解

    SpringBoot Starter機制及整合tomcat的實現(xiàn)詳解

    這篇文章主要介紹了SpringBoot Starter機制及整合tomcat的實現(xiàn),我們知道SpringBoot自己在“后臺”幫我們配置了很多原本需要我們手動去的東西,至于這個“后臺”是啥,就是Starter機制
    2022-09-09
  • Java利用跳躍表解決雙重隊列問題詳解

    Java利用跳躍表解決雙重隊列問題詳解

    這篇文章主要為大家詳細(xì)介紹了Java如何利用跳躍表來解決雙重隊列的問題。本文通過一個簡單的例題進(jìn)行了講解,感興趣的小伙伴可以了解一下
    2022-12-12
  • mybatis條件語句中帶數(shù)組參數(shù)的處理

    mybatis條件語句中帶數(shù)組參數(shù)的處理

    這篇文章主要介紹了mybatis條件語句中帶數(shù)組參數(shù)的處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA簡單分組的算法實現(xiàn)

    JAVA簡單分組的算法實現(xiàn)

    本文介紹了“JAVA簡單分組的算法實現(xiàn)”,需要的朋友可以參考一下
    2013-03-03
  • 詳解IDEA中MAVEN項目打JAR包的簡單方法

    詳解IDEA中MAVEN項目打JAR包的簡單方法

    本篇文章主要介紹了詳解IDEA中MAVEN項目打JAR包的簡單方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 詳解Spring中singleton?bean如何同時服務(wù)多個請求

    詳解Spring中singleton?bean如何同時服務(wù)多個請求

    這篇文章主要介紹了詳解Spring中singleton?bean如何同時服務(wù)多個請求
    2023-02-02

最新評論

平山县| 平顶山市| 勃利县| 长乐市| 张家口市| 石台县| 白朗县| 平定县| 桦南县| 七台河市| 涡阳县| 灵宝市| 灵武市| 江城| 腾冲县| 泉州市| 浦江县| 荆州市| 区。| 建阳市| 汝州市| 洪雅县| 新巴尔虎右旗| 合川市| 正镶白旗| 利津县| 天台县| 上林县| 封丘县| 永昌县| 高邑县| 古蔺县| 东乡| 民县| 沅江市| 始兴县| 吴旗县| 剑阁县| 琼中| 化州市| 黄平县|