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

Java導致內存泄漏的多種情況分析

 更新時間:2026年01月09日 08:49:33   作者:煙沙九洲  
本文介紹了Java中常見的內存泄漏情況,包括生命周期長的集合、未關閉的資源連接、ThreadLocal使用不當、內部類與外部類引用非靜態(tài)內部類、監(jiān)聽器與回調注冊后沒有注銷,推薦使用MAT和VisualVM等工具進行內存泄漏排查,感興趣的朋友跟隨小編一起看看吧

今天我們來一起聊一聊有哪些情況會導致內存泄漏。

什么是 內存泄漏 呢?

內存泄漏 是指對象 已經不再被程序使用,但因為某些原因 無法被垃圾回收器回收,長期占用內存,最終可能引發(fā) OOM(OutOfMemoryError)。

接下來我們看一下常見的幾類內存泄漏場景。

1、生命周期長的集合

將對象放入 靜態(tài) 或 生命周期很長 的集合(如 public static List<Object> list = new ArrayList<>();),即使后面不再需要,集合仍持有其引用,導致無法GC。

2、未關閉的資源

連接、流等資源未調用 close() 方法關閉。這些資源不僅占用內存,還可能占用文件句柄(操作系統(tǒng)分配的唯一標識,憑它,你才能操作文件資源)、網絡連接等系統(tǒng)資源。比如 數(shù)據庫連接、文件流(FileInputStream)、Socket連接 等。

public class FileTest {
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream("test.txt");
            // 讀取文件,未調用 fis.close()
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 未調用 fis.close() → fis 持有 Native 引用,無法回收
        }
    }
}

3、ThreadLocal 使用不當

將對象存入 ThreadLocal 后,未在后續(xù)調用 remove() 清理。若線程來自線程池(會復用),其 ThreadLocalMap 中的值會一直存活。

public class ThreadLocalTest {
    private static ThreadLocal<User> userThreadLocal = new ThreadLocal<>();
    public static void main(String[] args) {
        // 線程池(核心線程長期存活)
        TThreadPoolExecutor executor = new ThreadPoolExecutor(
                2,
                4,
                10,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(100),
                new ThreadFactoryBuilder().setNameFormat("my-thread-pool-%d").setDaemon(false).setPriority(Thread.NORM_PRIORITY).build(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        executor.submit(() -> {
            User user = new User("李四", 30);
            userThreadLocal.set(user); // 存儲到 ThreadLocal
            // 業(yè)務執(zhí)行完畢,未調用 remove()
            // 核心線程不會銷毀,ThreadLocal 仍持有 user 引用
        });
    }
}

ps:未進行 remove(),還可能會導致 ThreadLocal 取值串門。

4、內部類與外部類引用

非靜態(tài)內部類(或匿名類)會 隱式持有 外部類的引用。如果內部類實例生命周期更長(如被緩存或另一個線程引用),會阻止外部類被回收。

public class OuterClass {
    private byte[] bigData = new byte[1024 * 1024 * 10]; // 10MB 大對象
    // 非靜態(tài)內部類
    class InnerClass {
        // 內部類隱式持有 OuterClass 引用
    }
    public InnerClass createInner() {
        return new InnerClass();
    }
    public static void main(String[] args) {
        OuterClass outer = new OuterClass();
        InnerClass inner = outer.createInner();
        // 置空外部類引用,但 inner 仍持有 outer 引用
        outer = null;
        // 若 inner 被靜態(tài)變量/線程長期持有 → outer 對象(含 bigData)無法回收
    }
}

5、 監(jiān)聽器與回調

注冊了 監(jiān)聽器 或 回調 后,在對象不再需要時 沒有注銷,導致源對象仍持有監(jiān)聽器的引用(比如 事件監(jiān)聽器、消息隊列的消費者等)。

排查工具推薦

  • MAT(Memory Analyzer Tool):分析堆 Dump 文件,定位泄漏對象、引用鏈(誰在持有泄漏對象);
  • VisualVM:JDK 自帶工具,監(jiān)控內存占用趨勢,生成堆 Dump,簡單排查泄漏。

這里我只列了常見的幾種情況,歡迎大家補充其他內存泄漏場景。

到此這篇關于Java導致內存泄漏的多種情況分析的文章就介紹到這了,更多相關java內存泄漏內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中字符串根據寬度(像素)換行的問題

    Java中字符串根據寬度(像素)換行的問題

    這篇文章主要介紹了Java中字符串根據寬度(像素)換行的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java中的JVM虛擬機內存分配詳解

    Java中的JVM虛擬機內存分配詳解

    這篇文章主要介紹了Java中的JVM虛擬機內存分配詳解,虛擬機是一種能夠執(zhí)行 Java 字節(jié)碼的虛擬機,它是 Java 語言的核心組成部分,負責將 Java 代碼轉換為機器碼并執(zhí)行,JVM 提供了內存管理、垃圾回收、線程管理等功能,需要的朋友可以參考下
    2023-10-10
  • Apache Ignite 與 Spring Boot 集成詳細指南

    Apache Ignite 與 Spring Boot 集成詳細指南

    Apache Ignite官方指南詳解如何通過Spring Boot Starter擴展實現(xiàn)自動配置,支持厚/輕客戶端模式,簡化Ignite節(jié)點和客戶端的部署與管理,提升開發(fā)效率和可維護性,接下來通過本文介紹Apache Ignite與Spring Boot 集成詳細指南,感興趣的朋友一起看看吧
    2025-07-07
  • Java單元測試Powermockito和Mockito使用總結

    Java單元測試Powermockito和Mockito使用總結

    公司單元測試框架選用了Junit 4.12,Mock框架選用了Mockito和PowerMock,本文主要介紹了Java單元測試Powermockito和Mockito使用總結,感興趣的可以了解一下
    2021-09-09
  • IDEA自定義pom依賴的步驟詳解

    IDEA自定義pom依賴的步驟詳解

    這篇文章主要介紹了IDEA自定義pom依賴的步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • JavaEE中volatile、wait和notify詳解

    JavaEE中volatile、wait和notify詳解

    這篇文章主要給大家介紹了關于JavaEE中volatile、wait和notify的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • SpringData?Redis的具體使用

    SpringData?Redis的具體使用

    本文主要介紹了SpringData?Redis的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-04-04
  • Java基礎教程之包(package)

    Java基礎教程之包(package)

    這篇文章主要介紹了Java基礎教程之包(package),本文詳細講解了包的創(chuàng)建、使用等方法,需要的朋友可以參考下
    2014-08-08
  • JSR303校驗前端傳遞的數(shù)據方式

    JSR303校驗前端傳遞的數(shù)據方式

    這篇文章主要介紹了JSR303校驗前端傳遞的數(shù)據方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring?JPA之find拓展方法示例詳解

    Spring?JPA之find拓展方法示例詳解

    這篇文章主要為大家介紹了Spring?JPA之find拓展方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04

最新評論

黄山市| 大荔县| 连平县| 广德县| 涞源县| 应城市| 南靖县| 莒南县| 清远市| 资源县| 南溪县| 吴忠市| 囊谦县| 科尔| 广平县| 汉沽区| 衢州市| 安远县| 章丘市| 长沙县| 建瓯市| 乌兰察布市| 玛纳斯县| 双辽市| 佛坪县| 曲松县| 蓬安县| 姜堰市| 沙雅县| 富顺县| 东至县| 呼图壁县| 新和县| 武陟县| 定州市| 封开县| 吉林省| 资源县| 吉安市| 临泽县| 东乌珠穆沁旗|