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

java強(qiáng)引用、軟引用、弱引用、虛引用的使用小結(jié)

 更新時(shí)間:2026年04月02日 09:25:43   作者:編碼忘我  
本文解釋了Java中的不同引用類型及其作用,包括強(qiáng)引用、軟引用、弱引用和虛引用,具體分析了每種引用類型的回收機(jī)制,,感興趣的可以了解一下

在 Java 中,引用類型決定了對(duì)象在垃圾回收時(shí)的生命周期。以 User 對(duì)象為例,分別演示強(qiáng)引用、軟引用、弱引用、虛引用的用法及回收特性。

1. 強(qiáng)引用(Strong Reference)

特點(diǎn):最常用的引用,只要強(qiáng)引用存在,對(duì)象永遠(yuǎn)不會(huì)被 GC 回收。

User user = new User("Alice");
// 此時(shí) user 是強(qiáng)引用,User 對(duì)象不會(huì)被回收
user = null;   // 切斷引用后,對(duì)象才可能被回收

2. 軟引用(SoftReference)

特點(diǎn):通過(guò) SoftReference 實(shí)現(xiàn),當(dāng)內(nèi)存充足時(shí)保留,僅在內(nèi)存即將耗盡(即將 OOM)時(shí)才會(huì)被回收。適合實(shí)現(xiàn)內(nèi)存敏感的高速緩存。

// 創(chuàng)建軟引用
SoftReference<User> softRef = new SoftReference<>(new User("Bob"));
// 獲取對(duì)象
User user = softRef.get();   // 內(nèi)存充足時(shí)返回 User 對(duì)象,OOM 前可能返回 null
// 模擬內(nèi)存緊張時(shí),GC 會(huì)回收軟引用指向的對(duì)象
System.gc();   // 不保證立即回收,但若內(nèi)存緊張則會(huì)回收

3. 弱引用(WeakReference)

特點(diǎn):通過(guò) WeakReference 實(shí)現(xiàn),只要發(fā)生 GC,無(wú)論內(nèi)存是否充足,對(duì)象都會(huì)被回收。常用于規(guī)范映射(如 WeakHashMap)以及 ThreadLocal 的 key 設(shè)計(jì)。

// 創(chuàng)建弱引用
WeakReference<User> weakRef = new WeakReference<>(new User("Charlie"));
// 獲取對(duì)象(可能為 null)
User user = weakRef.get();   // GC 前存在,GC 后為 null
// 手動(dòng)觸發(fā) GC,對(duì)象會(huì)被回收
System.gc();
System.out.println(weakRef.get());   // 輸出 null

弱引用對(duì)象的回收時(shí)機(jī)是:只要垃圾回收器運(yùn)行,且對(duì)象僅被弱引用所引用,該對(duì)象就會(huì)被回收。具體到 ThreadLocal:

  1. 線程中定義了一個(gè) ThreadLocal 變量:ThreadLocal<String> local = new ThreadLocal<>();

    • 此時(shí) local 變量持有對(duì) ThreadLocal 實(shí)例的強(qiáng)引用(在棧上)。
    • ThreadLocal 實(shí)例也被當(dāng)前線程的 ThreadLocalMap 中的 Entry 弱引用著。
  2. 當(dāng)方法執(zhí)行完畢,local 變量出棧,強(qiáng)引用消失。

    • ThreadLocal 實(shí)例現(xiàn)在只被 Entry 弱引用。
  3. 隨后發(fā)生垃圾回收(如內(nèi)存不足時(shí)觸發(fā)的 Full GC 或系統(tǒng)調(diào)用的 System.gc())。

    • GC 發(fā)現(xiàn) ThreadLocal 實(shí)例只有弱引用,將其回收。
    • Entry 的 key 字段(即弱引用本身)被清除,變?yōu)?nbsp;null。

4. 虛引用(PhantomReference)

特點(diǎn):最弱的引用,通過(guò) PhantomReference 實(shí)現(xiàn)。無(wú)法通過(guò) get() 獲取對(duì)象實(shí)例,僅用于跟蹤對(duì)象被回收的通知(必須配合 ReferenceQueue)。常用于資源釋放監(jiān)控或?qū)ο蠡厥涨暗那謇怼?/p>

// 必須配合引用隊(duì)列
ReferenceQueue<User> queue = new ReferenceQueue<>();
// 創(chuàng)建虛引用
PhantomReference<User> phantomRef = new PhantomReference<>(new User("David"), queue);
// 無(wú)法獲取對(duì)象
User user = phantomRef.get();   // 永遠(yuǎn)返回 null
// 當(dāng)虛引用指向的對(duì)象被回收后,該引用會(huì)被加入隊(duì)列
System.gc();
Reference<? extends User> ref = queue.poll();
if (ref != null) {
    // 執(zhí)行回收后的清理工作
    System.out.println("User 對(duì)象已被回收");
}

5. 總結(jié)對(duì)比(以 User 對(duì)象為例)

引用類型示例代碼回收時(shí)機(jī)典型用途
強(qiáng)引用User u = new User();永不回收(除非引用置空)普通對(duì)象
軟引用SoftReference<User> s = new SoftReference<>(new User());內(nèi)存不足時(shí)回收緩存(如圖片緩存)
弱引用WeakReference<User> w = new WeakReference<>(new User());每次 GC 都可能回收WeakHashMap、ThreadLocal 的 key
虛引用PhantomReference<User> p = new PhantomReference<>(new User(), queue);任何時(shí)候都可能回收,且 get() 返回 null對(duì)象回收跟蹤、資源釋放

6. 延伸:ThreadLocal 為什么用弱引用?

ThreadLocal 內(nèi)部 ThreadLocalMap 的 key 使用弱引用,目的是當(dāng) ThreadLocal 實(shí)例不再被外部強(qiáng)引用時(shí),GC 可以回收它,避免 ThreadLocal 對(duì)象本身的內(nèi)存泄漏。但 value 仍是強(qiáng)引用,所以仍需要手動(dòng)調(diào)用 remove() 清除 value,防止線程池場(chǎng)景下出現(xiàn)內(nèi)存泄漏。

// ThreadLocalMap.Entry 源碼簡(jiǎn)寫(xiě)
static class Entry extends WeakReference<ThreadLocal<?>> {
    Object value;
    Entry(ThreadLocal<?> k, Object v) {
        super(k);   // key 是弱引用
        value = v;  // value 是強(qiáng)引用
    }
}

到此這篇關(guān)于java強(qiáng)引用、軟引用、弱引用、虛引用的使用小結(jié)的文章就介紹到這了,更多相關(guān)java強(qiáng)引用、軟引用、弱引用、虛引用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js-tab選項(xiàng)卡

    js-tab選項(xiàng)卡

    本文主要介紹了js-tab選項(xiàng)卡的示例代碼。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • Java引用類型interface的用法總結(jié)

    Java引用類型interface的用法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中引用類型interface的用法的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下
    2022-10-10
  • spring boot中使用RabbitMQ routing路由詳解

    spring boot中使用RabbitMQ routing路由詳解

    本篇文章主要介紹了spring boot中使用RabbitMQ routing路由詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java判斷線程池線程是否執(zhí)行完畢

    Java判斷線程池線程是否執(zhí)行完畢

    這篇文章主要介紹了Java判斷線程池線程是否執(zhí)行完畢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Idea中使用Git的流程

    Idea中使用Git的流程

    這篇文章主要介紹了Idea中使用Git的流程,git是目前流行的分布式版本管理系統(tǒng)。本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-09-09
  • 用遞歸查找有序二維數(shù)組的方法詳解

    用遞歸查找有序二維數(shù)組的方法詳解

    本篇文章是對(duì)用遞歸查找有序二維數(shù)組的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Java如何獲取接口所有的實(shí)現(xiàn)類

    Java如何獲取接口所有的實(shí)現(xiàn)類

    這篇文章主要介紹了Java如何獲取接口所有的實(shí)現(xiàn)類,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Java實(shí)現(xiàn)的傅里葉變化算法示例

    Java實(shí)現(xiàn)的傅里葉變化算法示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的傅里葉變化算法,結(jié)合具體實(shí)例形式分析了基于Java的傅里葉變化算法定義與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • SpringBoot+Redis+Lua實(shí)現(xiàn)接口限流的示例代碼

    SpringBoot+Redis+Lua實(shí)現(xiàn)接口限流的示例代碼

    本文主要介紹了SpringBoot+Redis+Lua實(shí)現(xiàn)接口限流的示例代碼,利用AOP攔截請(qǐng)求,通過(guò)Redis記錄訪問(wèn)次數(shù),達(dá)到限流效果,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-09-09
  • Spring?invokeBeanFactoryPostProcessors方法刨析源碼

    Spring?invokeBeanFactoryPostProcessors方法刨析源碼

    invokeBeanFactoryPostProcessors該方法會(huì)實(shí)例化所有BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor的實(shí)例并且執(zhí)行postProcessBeanFactory與postProcessBeanDefinitionRegistry方法
    2023-01-01

最新評(píng)論

青岛市| 全州县| 涞源县| 吉木萨尔县| 镇原县| 望城县| 友谊县| 桃江县| 乾安县| 通江县| 吕梁市| 泽普县| 南宁市| 庆云县| 孝义市| 玛曲县| 扶余县| 密云县| 迁安市| 西充县| 三明市| 山东| 蒙阴县| 浏阳市| 碌曲县| 大埔县| 静海县| 张掖市| 五河县| 金门县| 左贡县| 耒阳市| 抚州市| 太谷县| 鄂温| 台山市| 卓资县| 日土县| 松江区| 二连浩特市| 酉阳|