欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

概念介紹

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

01.??強(qiáng)引用

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

02.??軟引用

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

比如

image-20210620220531336

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

03.??弱引用

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

比如

image-20210620221353830

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

04.??虛引用

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

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

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

User user = new User(1, "Java4ye");
ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();
// 創(chuàng)建User對(duì)象的虛引用
PhantomReference<User> phantomReference = new PhantomReference<>(user, userReferenceQueue);
// 去掉強(qiáng)引用
user = null;
System.out.println(phantomReference.get());
// 手動(dòng)觸發(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("對(duì)象User被回收了:");
}

對(duì)象可達(dá)性

那么 簡(jiǎn)單介紹完上面的?4?種引用后,我們?cè)賮?lái)看看它的可達(dá)性~

如圖~

image-20210621083333189

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

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

對(duì)于軟引用、弱引用之類,垃圾收集器可能會(huì)存在二次確認(rèn)的問(wèn)題,以保證處于弱引用狀態(tài)的對(duì)象,沒(méi)有改變?yōu)閺?qiáng)引用。

在?JDK8?中,還可以通過(guò) 指定參數(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]

再記錄下這個(gè)點(diǎn)??

通過(guò)底層API來(lái)達(dá)到強(qiáng)引用??

image-20210621085544098

Springboot源碼中的使用

嘿嘿 終于來(lái)到重點(diǎn)了 ,正如開頭提到的~?4ye?也是在?Springboot?源碼中看到這個(gè)

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

那么這個(gè)?ConcurrentReferenceHashMap?到底有什么作用呢?

ConcurrentReferenceHashMap?能指定所存放對(duì)象的引用級(jí)別

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

image-20210621122940290

比如 在 Springboot自動(dòng)裝配原理探索 一文中提到的?Springboot SPI 機(jī)制?其中的主角:?SpringFactoriesLoader

源碼如下:

image-20210621092032074

還有自動(dòng)配置過(guò)程中的注解掃描?AnnotationsScanner

image-20210621093124042

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

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

image-20210621092723147

總結(jié)

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

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

相關(guān)文章

  • AQS同步組件Semaphore信號(hào)量案例剖析

    AQS同步組件Semaphore信號(hào)量案例剖析

    這篇文章主要為大家介紹了AQS同步組件Semaphore信號(hào)量案例剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • java枚舉是如何保證線程安全的

    java枚舉是如何保證線程安全的

    這篇文章主要介紹了java枚舉是如何保證線程安全的。Java SE5提供了一種新的類型-Java的枚舉類型,關(guān)鍵字enum可以將一組具名的值的有限集合創(chuàng)建為一種新的類型,而這些具名的值可以作為常規(guī)的程序組件使用,這是一種非常有用的功能。,需要的朋友可以參考下
    2019-06-06
  • Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    Java的LinkedHashMap的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下
    2023-09-09
  • Spring MVC InitBinder驗(yàn)證方法

    Spring MVC InitBinder驗(yàn)證方法

    這篇文章主要介紹了Spring MVC InitBinder驗(yàn)證方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • RabbitMQ消息隊(duì)列中多路復(fù)用Channel信道詳解

    RabbitMQ消息隊(duì)列中多路復(fù)用Channel信道詳解

    這篇文章主要介紹了RabbitMQ消息隊(duì)列中多路復(fù)用Channel信道詳解,消息Message是指在應(yīng)用間傳送的數(shù)據(jù),消息可以非常簡(jiǎn)單,比如只包含文本字符串,也可以更復(fù)雜,可能包含嵌入對(duì)象,需要的朋友可以參考下
    2023-08-08
  • Springboot整合log4j2日志全解總結(jié)

    Springboot整合log4j2日志全解總結(jié)

    這篇文章主要介紹了Springboot整合log4j2日志全解總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 如何把spring boot項(xiàng)目部署到tomcat容器中

    如何把spring boot項(xiàng)目部署到tomcat容器中

    本文給大家分享如何把spring boot項(xiàng)目部署到tomcat容器中,本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2017-04-04
  • restTemplate超時(shí)處理的策略方案

    restTemplate超時(shí)處理的策略方案

    這篇文章主要為大家介紹了restTemplate超時(shí)處理的策略方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java SpringBoot開發(fā)小技巧詳解

    Java SpringBoot開發(fā)小技巧詳解

    這篇文章主要介紹了淺談SpringBoot項(xiàng)目如何讓前端開發(fā)提高效率(小技巧),主要介紹了Swagger和Nginx提高效率的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Netty分布式NioSocketChannel注冊(cè)到selector方法解析

    Netty分布式NioSocketChannel注冊(cè)到selector方法解析

    這篇文章主要為大家介紹了Netty分布式源碼分析NioSocketChannel注冊(cè)到selector方法的解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03

最新評(píng)論