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

相關(guān)文章
Java動態(tài)數(shù)組添加數(shù)據(jù)的方法與應(yīng)用示例
這篇文章主要介紹了Java動態(tài)數(shù)組添加數(shù)據(jù)的方法,結(jié)合實例形式詳細(xì)分析了Java動態(tài)數(shù)組的創(chuàng)建、添加、查找、打印等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11解決Eclipse add external jars運(yùn)行出現(xiàn)java.lang.NoClassDefFoundErro
本篇文章對Eclipse add external jars導(dǎo)致運(yùn)行出現(xiàn)java.lang.NoClassDefFoundError的解決方法進(jìn)行了詳細(xì)的分析介紹。需要的朋友參考下2013-05-05走進(jìn)SpringBoot之配置文件與多環(huán)境詳解
這篇文章主要介紹了走進(jìn)SpringBoot之配置文件與多環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05