Java的四種引用方式
1.強(qiáng)引用(StrongReference)
- 使用最普遍的引用。
- 只要引用鏈沒有斷開,強(qiáng)引用就不會(huì)斷開。- 當(dāng)內(nèi)存空間不足,拋出
OutOfMemoryError終止程序也不會(huì)回收具有強(qiáng)引用的對(duì)象。 - 通過將對(duì)象設(shè)置為null來弱化引用,使其被回收
Object object = new Object(); String str = "scc"; //都是強(qiáng)引用
2.軟引用(SoftReference)
- 對(duì)象處在有用但非必須的狀態(tài)
- 只有當(dāng)內(nèi)存空間不足時(shí), GC會(huì)回收該引用的對(duì)象的內(nèi)存。
- 可以用來實(shí)現(xiàn)高速緩存(作用)--比如網(wǎng)頁緩存、圖片緩存
// 注意:wrf這個(gè)引用也是強(qiáng)引用,它是指向SoftReference這個(gè)對(duì)象的,
// 這里的軟引用指的是指向new String("str")的引用,也就是SoftReference類中T
SoftReference<String> wrf = new SoftReference<String>(new String("str"));
3.弱引用(WeakReference)
弱引用就是只要JVM垃圾回收器發(fā)現(xiàn)了它,就會(huì)將之回收。
- 非必須的對(duì)象,比軟引用更弱一-些
- GC時(shí)會(huì)被回
- 被回收的概率也不大,因?yàn)镚C線程優(yōu)先級(jí)比較低
- 適用于引用偶爾被使用且不影響垃圾收集的對(duì)象 使用:
Map<Key, ResourceWeakReference> activeEngineResources = new HashMap<>(); //ResourceWeakReference弱引用
4.虛引用(PhantomReference)
- 不會(huì)決定對(duì)象的生命周期
- 任何時(shí)候都可能被垃圾收集器回收
- 跟蹤對(duì)象被垃圾收集器回收的活動(dòng),起哨兵作用
- 必須和引用隊(duì)列
ReferenceQueue聯(lián)合使用
當(dāng)垃圾回收器準(zhǔn)備回收一個(gè)對(duì)象時(shí),如果發(fā)現(xiàn)它還有虛引用,就會(huì)把這個(gè)虛引用加入到與之 關(guān)聯(lián)的引用隊(duì)列中。
程序可以通過判斷引用隊(duì)列中是否已經(jīng)加入了虛引用,來了解被引用的對(duì)象是否將要被垃圾回收。如果程序發(fā)現(xiàn)某個(gè)虛引用已經(jīng)被加入到引用隊(duì)列,那么就可以在所引用的對(duì)象的內(nèi)存被回收之前采取必要的行動(dòng)。
Object obj = new Object(); ReferenceQueue queue = new ReferenceQueue(); PhantomReference reference = new PhantomReference(obj, queue); //強(qiáng)引用對(duì)象滯空,保留軟引用 obj = null;
5. 引用隊(duì)列(ReferenceQueue)
- 無實(shí)際存儲(chǔ)結(jié)構(gòu),存儲(chǔ)邏輯依賴于內(nèi)部節(jié)點(diǎn)之間的關(guān)系來表達(dá)
- 存儲(chǔ)關(guān)聯(lián)的且被GC的軟引用,弱引用以及虛引用

相關(guān)文章
java實(shí)現(xiàn)簡(jiǎn)單發(fā)送郵件功能
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法
這篇文章主要介紹了SpringBoot項(xiàng)目修改訪問端口和訪問路徑的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
idea中增強(qiáng)for循環(huán)提示unexpected token問題
這篇文章主要介紹了idea中增強(qiáng)for循環(huán)提示unexpected token問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring Security基于數(shù)據(jù)庫實(shí)現(xiàn)認(rèn)證過程解析
這篇文章主要介紹了Spring Security基于數(shù)據(jù)庫實(shí)現(xiàn)認(rèn)證過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
java使用BeanUtils.copyProperties方法對(duì)象復(fù)制同名字段類型不同賦值為空問題解決方案
這篇文章主要給大家介紹了關(guān)于java使用BeanUtils.copyProperties方法對(duì)象復(fù)制同名字段類型不同賦值為空問題的解決方案,文中通過代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
MyBatis中的SQL映射文件如何配置參數(shù)映射和使用方法
MyBatis 是一種開源的 Java 持久化框架,它可以自動(dòng)將數(shù)據(jù)庫中的數(shù)據(jù)映射到 Java 對(duì)象中,并且使得 Java 對(duì)象可以非常方便地存儲(chǔ)到數(shù)據(jù)庫中,本文將介紹 MyBatis 中 SQL 映射文件的參數(shù)映射配置和使用方法,需要的朋友可以參考下2023-07-07
里氏代換原則_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了里氏代換原則的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08

