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

java引用類型WeakReference用法及原理詳解

 更新時間:2026年01月19日 09:53:39   作者:看透也說透kevin  
Java弱引用(WeakReference)是一種特殊的引用類型,當垃圾回收器運行時,無論內(nèi)存是否充足,只要發(fā)現(xiàn)對象僅被弱引用指向,就會立即回收該對象,這篇文章主要介紹了java引用類型WeakReference用法及原理的相關資料,需要的朋友可以參考下

1. 核心概念:什么是 WeakReference?

WeakReference(弱引用)是 Java java.lang.ref 包下提供的一種引用類型。它的特點是:當垃圾回收器(GC)進行掃描時,無論當前內(nèi)存是否充足,只要被弱引用關聯(lián)的對象沒有其他強引用**,那么這個對象就會被回收。

這與我們平時普通的對象引用(強引用,Strong Reference)形成鮮明對比:

  • 強引用Object obj = new Object();。只要強引用存在,垃圾收集器就永遠不會回收被引用的對象。
  • 弱引用WeakReference<Object> weakRef = new WeakReference<>(obj);。即使弱引用存在,只要發(fā)生 GC 且對象沒有強引用,它就會被回收。

2. 工作原理

WeakReference 的工作原理與 Java 的垃圾回收機制緊密相關。JVM 中的垃圾回收器使用可達性分析算法來判斷對象是否存活。

可達性分析:
GC Roots 是所有引用鏈的起點(如虛擬機棧中的局部變量、靜態(tài)變量等)。如果一個對象到 GC Roots 沒有任何引用鏈相連,則證明此對象是不可用的。

引用級別(強度從高到低):

  1. 強引用 (Strong Reference):絕不回收。
  2. 軟引用 (Soft Reference):內(nèi)存不足時(OOM 前)才回收。
  3. 弱引用 (Weak Reference)發(fā)現(xiàn)即回收。只要 GC 發(fā)現(xiàn)一個對象只被弱引用指向,就會立刻將其標記為可回收對象,并在下一次 GC 時回收其內(nèi)存。
  4. 虛引用 (Phantom Reference):對象回收跟蹤。無法通過它獲取對象實例,其唯一目的是在對象被回收時收到一個系統(tǒng)通知。

WeakReference 的工作流程可以簡化為:

  1. 你創(chuàng)建一個對象,并用一個 WeakReference 來包裝它。
  2. 當你將對象的強引用置為 nullobj = null;)后,這個對象就只剩下 WeakReference 這一個“微弱”的引用了。
  3. 下一次垃圾回收發(fā)生時,GC 會發(fā)現(xiàn)這個對象是“弱可達”的。
  4. GC 會立即回收這個對象的內(nèi)存。
  5. 回收之后,你的 WeakReference.get() 方法將返回 null。

3. 主要用法和示例

基本使用

import java.lang.ref.WeakReference;

public class WeakReferenceDemo {
    public static void main(String[] args) {
        // 1. 創(chuàng)建一個強引用對象
        Object strongRef = new Object();

        // 2. 用弱引用包裝這個對象
        WeakReference<Object> weakRef = new WeakReference<>(strongRef);

        // 3. 此時既有強引用,也有弱引用。GC 不會回收它。
        System.out.println("Before GC (Strong ref exists): " + weakRef.get()); // 有輸出

        // 4. 切斷強引用!這是關鍵一步。
        strongRef = null;

        // 5. 建議系統(tǒng)進行垃圾回收(這只是建議,不保證立即執(zhí)行)
        System.gc();

        // 6. 給 GC 一點時間執(zhí)行
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 7. 檢查弱引用指向的對象是否被回收
        System.out.println("After GC (Only weak ref): " + weakRef.get()); // 輸出 null
    }
}

輸出結果:

Before GC (Strong ref exists): java.lang.Object@1b6d3586
After GC (Only weak ref): null

典型應用場景:實現(xiàn)內(nèi)存敏感的緩存

這是 WeakReference 最經(jīng)典的使用場景。你可以用它來構建一個緩存,當內(nèi)存不足時,緩存中的條目會被自動清除,從而避免內(nèi)存泄漏(Memory Leak)。

import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;

public class SimpleCache<K, V> {
    private final Map<K, WeakReference<V>> cache = new HashMap<>();

    public void put(K key, V value) {
        cache.put(key, new WeakReference<>(value));
    }

    public V get(K key) {
        WeakReference<V> weakRef = cache.get(key);
        if (weakRef != null) {
            // 如果弱引用指向的對象還沒被GC回收,就返回它
            return weakRef.get();
        }
        // 如果被回收了或者不存在,就返回null
        return null;
    }

    // 可以添加一個方法來清理Map中那些已經(jīng)被GC回收的條目(key還在,value為null的Entry)
    public void cleanUp() {
        cache.entrySet().removeIf(entry -> entry.getValue().get() == null);
    }
}


為什么這樣用?

緩存的數(shù)據(jù)通常不是至關重要的。如果內(nèi)存緊張,丟棄部分緩存數(shù)據(jù)是可以接受的,應用程序可以從原始數(shù)據(jù)源(如數(shù)據(jù)庫)重新加載。使用 WeakReference 可以讓 GC 充當你的“緩存清理工”,自動管理內(nèi)存,你無需編寫復雜的內(nèi)存淘汰算法(如 LRU)。

注意: 上面的 SimpleCache 中的 Map 本身仍然持有 key 的強引用和 WeakReference 對象的強引用。如果 key 本身是一個大對象,你可能需要類似 WeakHashMap 的結構。

4. 注意事項

  1. 配合 ReferenceQueue 使用:你可以將一個 ReferenceQueue 傳遞給 WeakReference 的構造函數(shù)。當弱引用指向的對象被垃圾回收后,這個 WeakReference 對象本身會被加入到這個隊列中。這允許你執(zhí)行一些后續(xù)的清理工作,例如從緩存 Map 中移除對應的鍵。

    ReferenceQueue queue = new ReferenceQueue<>();
    WeakReference weakRef = new WeakReference<>(new Object(), queue);
    // … 之后可以檢查 queue.poll() 來獲取被回收的引用

  2. 不是銀彈WeakReference 主要用于緩解內(nèi)存問題,而不是解決邏輯問題。你的代碼必須能處理 get() 返回 null 的情況(即對象已被回收)。

  3. 性能:頻繁創(chuàng)建 WeakReference 對象和進行 GC 本身也有開銷,不要濫用。

  4. 與 SoftReference 的區(qū)別

    • WeakReference:GC 看到就回收,更激進。
    • SoftReference:只有在內(nèi)存不足(即將發(fā)生 OOM)時才會回收,更適合做緩存,因為能盡可能長時間地保留數(shù)據(jù)。而 WeakReference 的緩存被回收得更快。

總結

特性描述
本質(zhì)一種不影響垃圾回收決策的引用類型。
核心原則僅被弱引用關聯(lián)的對象,在 GC 時必定被回收。
主要用途實現(xiàn)規(guī)范化映射(如 WeakHashMap)、內(nèi)存敏感的高速緩存、監(jiān)聽器列表等,防止因緩存等原因?qū)е碌膬?nèi)存泄漏。
如何使用1. 創(chuàng)建 WeakReference 包裝對象。
2. 確保沒有其他強引用指向該對象。
3. 在代碼中總是檢查 get() 是否返回 null。

到此這篇關于java引用類型WeakReference用法及原理的文章就介紹到這了,更多相關java WeakReference用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring?Cloud?Gateway?2.x跨域時出現(xiàn)重復Origin的BUG問題

    Spring?Cloud?Gateway?2.x跨域時出現(xiàn)重復Origin的BUG問題

    這篇文章主要介紹了Spring?Cloud?Gateway?2.x跨域時出現(xiàn)重復Origin的BUG問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java 線程池詳解及創(chuàng)建簡單實例

    Java 線程池詳解及創(chuàng)建簡單實例

    這篇文章主要介紹了Java 線程池詳解及創(chuàng)建簡單實例的相關資料,需要的朋友可以參考下
    2017-02-02
  • Spring?Boot?Interceptor的原理、配置、順序控制及與Filter的關鍵區(qū)別對比分析

    Spring?Boot?Interceptor的原理、配置、順序控制及與Filter的關鍵區(qū)別對比分析

    本文主要介紹了Spring?Boot中的攔截器(Interceptor)及其與過濾器(Filter)的區(qū)別,攔截器是Spring?MVC提供的接口,可以實現(xiàn)請求處理前后的邏輯,本文介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Spring中基于xml的AOP實現(xiàn)詳解

    Spring中基于xml的AOP實現(xiàn)詳解

    這篇文章主要介紹了Spring中基于xml的AOP實現(xiàn)詳解,基于xml與基于注解的AOP本質(zhì)上是非常相似的,都是需要封裝橫切關注點,封裝到切面中,然后把橫切關注點封裝為一個方法,再把該方法設置為當前的一個通知,再通過切入點表達式定位到橫切點就可以了,需要的朋友可以參考下
    2023-09-09
  • 可能是全網(wǎng)最詳細的springboot整合minio教程

    可能是全網(wǎng)最詳細的springboot整合minio教程

    MinIO是全球領先的對象存儲先鋒,在標準硬件上,讀/寫速度上高達183 GB/秒和171 GB/秒,下面這篇文章主要給大家介紹了關于springboot整合minio的相關資料,這個教程可能是全網(wǎng)最詳細的,需要的朋友可以參考下
    2022-06-06
  • Java動態(tài)數(shù)組ArrayList實現(xiàn)動態(tài)原理

    Java動態(tài)數(shù)組ArrayList實現(xiàn)動態(tài)原理

    ArrayList是一種動態(tài)數(shù)組,它可以在運行時自動調(diào)整大小以適應元素的添加和刪除,在Java中,你可以使用ArrayList類來實現(xiàn)動態(tài)數(shù)組,本文將給大家介紹一下ArrayList動態(tài)數(shù)組,是怎么實現(xiàn)動態(tài)的
    2023-08-08
  • 高分面試分析jvm如何實現(xiàn)多態(tài)

    高分面試分析jvm如何實現(xiàn)多態(tài)

    這篇文章主要介紹了講解了在面試中jvm如何實現(xiàn)多態(tài),怎樣回答才能得到高分的問題分析,有需要的朋友可以借鑒參考下,祝大家早日升職加薪多多進步
    2022-01-01
  • intellij idea隱藏.iml和.idea等自動生成文件的問題

    intellij idea隱藏.iml和.idea等自動生成文件的問題

    這篇文章主要介紹了intellij idea隱藏.iml和.idea等自動生成文件的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • IDEA創(chuàng)建Gradle項目然后刪除報錯問題及解決

    IDEA創(chuàng)建Gradle項目然后刪除報錯問題及解決

    這篇文章主要介紹了IDEA創(chuàng)建Gradle項目然后刪除報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Spring Cloud Config配置詳解

    Spring Cloud Config配置詳解

    這篇文章主要介紹了Spring Cloud Config配置詳解,Spring Cloud Config簡化了配置管理的整個流程,包括配置的存放、獲取、變更通知、自動刷新和安全保護,需要的朋友可以參考下
    2026-05-05

最新評論

城固县| 黑河市| 宁河县| 洪洞县| 仁布县| 新河县| 汝南县| 合作市| 绥棱县| 云龙县| 团风县| 丰县| 康平县| 天台县| 上饶市| 灵寿县| 云安县| 克什克腾旗| 齐齐哈尔市| 铜川市| 长葛市| 防城港市| 青岛市| 芦山县| 南宫市| 金乡县| 辛集市| 桓仁| 宿松县| 涟源市| 阿坝县| 焉耆| 西宁市| 收藏| 宣化县| 科技| 长沙县| 蓝山县| 太白县| 韶山市| 肇州县|