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

Java引用機制之強引用、軟引用、弱引用和虛引用的實戰(zhàn)指南

 更新時間:2025年12月12日 09:15:35   作者:拾荒的小海螺  
Java 的引用機制是垃圾回收(GC)體系中極為關(guān)鍵的一部分,不同引用類型代表不同的對象生命周期管理方式,Java 從 JDK 1.2 起提供了四種引用級別強引用、軟引用、弱引用和虛引用,本文將逐一講解它們的特點、內(nèi)存行為、適用場景,并提供實踐示例代碼

1、簡述

Java 的引用機制是垃圾回收(GC)體系中極為關(guān)鍵的一部分,不同引用類型代表不同的對象生命周期管理方式。合理使用引用類型,可以顯著優(yōu)化內(nèi)存利用率,提高系統(tǒng)穩(wěn)定性,尤其在緩存設(shè)計、資源管理和大規(guī)模數(shù)據(jù)處理場景中。

Java 從 JDK 1.2 起提供了四種引用級別:

  • 強引用(Strong Reference)
  • 軟引用(Soft Reference)
  • 弱引用(Weak Reference)
  • 虛引用(Phantom Reference)

本文將逐一講解它們的特點、內(nèi)存行為、適用場景,并提供實踐示例代碼。

2、引用機制

2.1 強引用(Strong Reference)

特點

  • Java 默認的引用方式,例如:Object obj = new Object();
  • 最強引用級別,只要存在強引用,GC 永不會回收該對象。
  • 可能導致 OOM,如果強引用鏈無法斷開。

典型應(yīng)用

  • 普通對象的創(chuàng)建與訪問。
  • 業(yè)務(wù)邏輯中絕大部分引用。

2.2 軟引用(Soft Reference)

特點

  • 內(nèi)存不足時,GC 會優(yōu)先回收軟引用指向的對象
  • 非內(nèi)存不足時,不會被回收。
  • 適用于構(gòu)建內(nèi)存敏感緩存(如圖片緩存、數(shù)據(jù)緩沖區(qū)等)。

典型應(yīng)用

  • Guava Cache、部分本地緩存策略。
  • 內(nèi)存有限的移動端、IoT 程序的資源管理。
import java.lang.ref.SoftReference;

public class SoftRefDemo {
    public static void main(String[] args) {
        SoftReference<byte[]> softRef = new SoftReference<>(new byte[10 * 1024 * 1024]); // 10MB
        System.out.println("Before GC: " + softRef.get());

        System.gc();
        System.out.println("After GC: " + softRef.get());  // 大概率存在

        // 占用大量內(nèi)存觸發(fā)回收
        try {
            byte[] bigData = new byte[100 * 1024 * 1024];
        } catch (Error e) {
            System.out.println("內(nèi)存不足,軟引用對象被回收: " + softRef.get());
        }
    }
}

2.3 弱引用(Weak Reference)

特點

  • 一旦 GC 執(zhí)行,無論內(nèi)存是否緊張,都會回收弱引用指向的對象。
  • 弱引用典型特點:朝生暮死

典型應(yīng)用

  • 緩存(比軟引用更“短命”)。
  • ThreadLocalMap 的 key(防止內(nèi)存泄漏)。
  • 弱鍵 HashMap(WeakHashMap)。
import java.lang.ref.WeakReference;

public class WeakRefDemo {
    public static void main(String[] args) {
        WeakReference<String> weakRef = new WeakReference<>(new String("hello weak"));
        System.out.println("Before GC: " + weakRef.get());

        System.gc();
        System.out.println("After GC: " + weakRef.get());  // 必定為 null
    }
}

2.4 虛引用(Phantom Reference)

特點

  • 最弱的引用類型:phantomRef.get() 永遠返回 null。
  • 必須結(jié)合 ReferenceQueue 使用。
  • GC 回收對象前,會將虛引用放入隊列,用于資源清理。

應(yīng)用場景

  • 替代 finalize(),實現(xiàn)更安全的資源釋放。
  • 監(jiān)控對象回收過程。
  • DirectByteBuffer 底層內(nèi)存釋放機制。
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

public class PhantomRefDemo {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<Object> queue = new ReferenceQueue<>();
        Object obj = new Object();
        PhantomReference<Object> phantomRef = new PhantomReference<>(obj, queue);

        System.out.println("Phantom get(): " + phantomRef.get()); // 永遠是 null

        obj = null;
        System.gc();

        Thread.sleep(100);
        System.out.println("引用隊列是否有元素: " + (queue.poll() != null));
    }
}

3、結(jié)合實際場景的應(yīng)用示例

3.1 使用軟引用構(gòu)建簡單緩存

import java.lang.ref.SoftReference;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SoftCache<K, V> {
    private final Map<K, SoftReference<V>> cache = new ConcurrentHashMap<>();

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

    public V get(K key) {
        SoftReference<V> ref = cache.get(key);
        return ref == null ? null : ref.get(); // 若被回收則返回 null
    }
}

3.2 WeakHashMap 自動回收 key

import java.util.WeakHashMap;

public class WeakHashMapDemo {
    public static void main(String[] args) {
        WeakHashMap<Object, String> map = new WeakHashMap<>();
        Object key = new Object();
        map.put(key, "value");

        System.out.println("Before: " + map);

        key = null;
        System.gc();

        try { Thread.sleep(100); } catch (Exception ignored) {}
        System.out.println("After: " + map);
    }
}

4、總結(jié)

  • 強引用:正常使用,生命周期最長
  • 軟引用:適合可回收緩存,避免 OOM
  • 弱引用:適合避免內(nèi)存泄漏,如 WeakHashMap、ThreadLocal
  • 虛引用:適用于對象回收監(jiān)聽,資源釋放管理

掌握這四種引用方式,有助于在高性能、高并發(fā)系統(tǒng)中更精細地管理內(nèi)存,提高系統(tǒng)健壯性。

引用類型GC 回收時機是否可通過 get() 獲得對象常見用途
強引用永不回收可以普通對象
軟引用內(nèi)存不足時回收可以緩存(內(nèi)存敏感)
弱引用一遇 GC 即回收可以WeakHashMap、避免內(nèi)存泄漏
虛引用回收前通知不可以(always null)資源清理、監(jiān)控對象生命周期

以上就是Java引用機制之強引用、軟引用、弱引用和虛引用的實戰(zhàn)指南的詳細內(nèi)容,更多關(guān)于Java強引用、軟引用、弱引用和虛引用的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java虛擬機如何運行Java字節(jié)碼

    Java虛擬機如何運行Java字節(jié)碼

    這篇文章主要介紹了Java虛擬機如何運行Java字節(jié)碼的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • java異常中throw和throws的區(qū)別及說明

    java異常中throw和throws的區(qū)別及說明

    這篇文章主要介紹了java異常中throw和throws的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • MyBatis-Plus?Page?分頁不生效的問題解決

    MyBatis-Plus?Page?分頁不生效的問題解決

    分頁是常見的一種功能,本文主要介紹了MyBatis-Plus?Page分頁不生效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • Springboot配置管理Externalized?Configuration深入探究

    Springboot配置管理Externalized?Configuration深入探究

    這篇文章主要介紹了Springboot配置管Externalized?Configuration深入探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Spring源碼解析后置處理器梳理總結(jié)

    Spring源碼解析后置處理器梳理總結(jié)

    這篇文章主要介紹了Spring源碼解析后置處理器梳理總結(jié),在前面幾篇文章中梳理了Spring中bean的創(chuàng)建過程,在這個過程中各式各樣的后置處理器發(fā)揮了不同的作用,可以說后置處理器貫穿了bean的實例化以及初始化過程
    2022-07-07
  • java中對象和JSON格式的轉(zhuǎn)換方法代碼

    java中對象和JSON格式的轉(zhuǎn)換方法代碼

    JSON格式可以輕松地以面向?qū)ο蟮姆绞睫D(zhuǎn)換為Java對象,下面這篇文章主要給大家介紹了關(guān)于java中對象和JSON格式的轉(zhuǎn)換方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Spring(一):IOC如何推導和理解

    Spring(一):IOC如何推導和理解

    下面小編就為大家?guī)硪黄斦凷pring對IOC的理解(推薦篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • Java語言Iterator轉(zhuǎn)換成 List的方法

    Java語言Iterator轉(zhuǎn)換成 List的方法

    在 Java 中,迭代器(Iterator)是一種用于遍歷集合中元素的對象,它提供了一種簡單而一致的方式來訪問集合中的元素,而不需要暴露集合內(nèi)部的結(jié)構(gòu),這篇文章主要介紹了Java語言Iterator轉(zhuǎn)換成 List的方法,需要的朋友可以參考下
    2023-08-08
  • java解一個比較特殊的數(shù)組合并題

    java解一個比較特殊的數(shù)組合并題

    這篇文章主要介紹了java解一個比較特殊的數(shù)組合并題,需要的朋友可以參考下
    2014-06-06
  • Idea中springboot項目的熱部署無法生效問題解決

    Idea中springboot項目的熱部署無法生效問題解決

    本文主要介紹了Idea中springboot項目的熱部署無法生效問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-10-10

最新評論

阳高县| 平南县| 班戈县| 宁城县| 福安市| 苏尼特右旗| 隆回县| 女性| 富蕴县| 三门县| 疏勒县| 南城县| 定西市| 芜湖县| 安泽县| 进贤县| 崇左市| 怀安县| 葫芦岛市| 龙陵县| 邻水| 新疆| 太白县| 科技| 崇仁县| 比如县| 利津县| 固镇县| 镇康县| 海口市| 越西县| 德州市| 莆田市| 鄄城县| 巫溪县| 青神县| 牟定县| 百色市| 吴川市| 枝江市| 九台市|