溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

四種引用類型在JAVA Springboot中怎么用

發(fā)布時(shí)間:2021-09-03 13:23:30 來源:億速云 閱讀:147 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下四種引用類型在JAVA Springboot中怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

概念介紹

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

01.  強(qiáng)引用

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

02.  軟引用

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

比如

四種引用類型在JAVA Springboot中怎么用

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

03.  弱引用

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

比如

四種引用類型在JAVA Springboot中怎么用

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

04.  虛引用

虛引用( ReferenceQueue ) , 這個(gè)也是隨時(shí)會(huì)被回收,不過它的作用更像一個(gè)標(biāo)記,當(dāng)對(duì)象被回收時(shí),它不為 null ,但是要注意,無論什么時(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è)賮砜纯此目蛇_(dá)性~

如圖~

四種引用類型在JAVA Springboot中怎么用

  • 強(qiáng)可達(dá): 比如 創(chuàng)建一個(gè)對(duì)象時(shí),創(chuàng)建它的線程對(duì)該對(duì)象就是強(qiáng)可達(dá)

  • 軟可達(dá): 只能通過軟引用訪問

  • 弱可達(dá): 只能通過弱引用訪問

  • 虛可達(dá): 當(dāng)對(duì)象沒有 強(qiáng),軟,弱 引用關(guān)聯(lián)時(shí),并且 finalize 過,就會(huì)進(jìn)入該狀態(tài)

  • 不可達(dá): 意味著該對(duì)象可以被清除了。

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

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

在 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]

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

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

四種引用類型在JAVA Springboot中怎么用

Springboot源碼中的使用

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

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

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

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

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

四種引用類型在JAVA Springboot中怎么用

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

源碼如下:

四種引用類型在JAVA Springboot中怎么用

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

四種引用類型在JAVA Springboot中怎么用

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

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

四種引用類型在JAVA Springboot中怎么用

以上是“四種引用類型在JAVA Springboot中怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI