欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

分析ThreadLocal內(nèi)存泄漏問題

 更新時間:2023年07月12日 11:30:53   作者:小小小小明明明明明明明明  
ThreadLocal的作用是提供線程內(nèi)的局部變量,這種變量在線程生命周期內(nèi)起作用,減少同一個線程內(nèi)多個函數(shù)或者組件之間一些公共變量傳遞的復(fù)雜度,但是如果濫用ThreadLocal可能會導致內(nèi)存泄漏,所以本文將為大家分析ThreadLocal內(nèi)存泄漏問題

ThreadLocal的實現(xiàn)原理

ThreadLocal的實現(xiàn):

每一個Thread內(nèi)部維護一個ThreadLocalMap映射表,這個映射表的keyThreadLocal實例本身,value是真正需要存儲的Object。

也就是說ThreadLocal本身不存儲值,它只是作為一個key來讓線程從ThreadLocalMap獲取value的。但是ThreadLocalMap是使用ThreadLocal的弱引用作為key的,弱引用的對象在GC時會被回收。

ThreadLocal為什么會內(nèi)存泄漏

ThreadLocalMap使用ThreadLocal的弱引用作為key,如果一個ThreadLocal沒有外部強引用來引用它,那么系統(tǒng)GC的時候,這個ThreadLocal會被回收,這樣一來,ThreadLocalMap中會出現(xiàn)keynullEntry,這樣就沒有辦法訪問keynullEntryvalue,如果當前線程遲遲不結(jié)束,這些keynullEntryvalue就會存在一條強引用鏈,永遠無法回收,造成內(nèi)存泄漏。

其實ThreadLocal的設(shè)計中已經(jīng)考慮到了這種情況,也加上了一些預(yù)防措施,在調(diào)用get、set、remove方法的時候,會清楚線程ThreadLocalMap里所有keynullvalue。

但是這些被動的預(yù)防措施并不能保證不會內(nèi)存泄漏:

  • 使用staticThreadLocal,延長了ThreadLocal的生命周期,可能導致的內(nèi)存泄漏。
  • 分配使用了ThreadLocal又不再調(diào)用get() ,set() ,remove() 方法,那么就會導致內(nèi)存泄漏。

為什么使用弱引用

從表面上看內(nèi)存泄漏的根本原因是使用了弱引用,那么為什么使用弱引用而不使用強引用呢?下面看看官方文檔的說法:

To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys.

翻譯過來就是:為了應(yīng)對非常大和長時間的用途,哈希表使用弱引用。

下面我們分兩種情況討論:

  • key 使用強引用:引用的ThreadLocal的對象被回收了,但是ThreadLocalMap還持有ThreadLocal的強引用,如果沒有手動刪除,ThreadLocal不會被回收,導致Entry內(nèi)存泄漏。
  • key 使用弱引用:引用的ThreadLocal的對象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使沒有手動刪除,ThreadLocal也會被回收。value在下一次ThreadLocalMap調(diào)用set,get,remove的時候會被清除。

比較兩種情況,我們可以發(fā)現(xiàn):由于ThreadLocalMap的生命周期跟Thread一樣長,如果都沒有手動刪除對應(yīng)key,都會導致內(nèi)存泄漏,但是使用弱引用可以多一層保障:弱引用 ThreadLocal 不會內(nèi)存泄漏,對應(yīng)的 value 在下一次 ThreadLocalMap 調(diào)用 set , get , remove 的時候會被清除。

因此,ThreadLocal內(nèi)存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一樣長,如果沒有手動刪除對應(yīng)key就會導致內(nèi)存泄漏,而不是因為弱引用。

ThreadLocal最佳實踐

綜合上面的分析,我們可以理解ThreadLocal內(nèi)存泄漏的前因后果,那么怎么避免內(nèi)存泄漏呢?

  • 每次使用完ThreadLocal,都調(diào)用它的remove() 方法,清除數(shù)據(jù)。

在使用線程池的情況下,沒有及時清理ThreadLocal,不僅是內(nèi)存泄漏的問題,更嚴重的是可能導致業(yè)務(wù)邏輯出現(xiàn)問題。所以,使用ThreadLocal就跟加鎖完要解鎖一樣,用完就清理。

到此這篇關(guān)于分析ThreadLocal內(nèi)存泄漏問題的文章就介紹到這了,更多相關(guān)ThreadLocal內(nèi)存泄漏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IntelliJ IDEA Project窗口的一些設(shè)置詳解

    IntelliJ IDEA Project窗口的一些設(shè)置詳解

    這篇文章主要介紹了IntelliJ IDEA Project窗口的一些設(shè)置詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • 使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題

    使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題

    這篇文章主要介紹了使用spring boot開發(fā)時java對象和Json對象轉(zhuǎn)換的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java面試題沖刺第二十天--算法(1)

    Java面試題沖刺第二十天--算法(1)

    這篇文章主要為大家分享了最有價值的三道關(guān)于算法的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 手把手教你SpringBoot快速集成Swagger的配置過程

    手把手教你SpringBoot快速集成Swagger的配置過程

    這篇文章主要介紹了手把手教你SpringBoot快速集成Swagger的配置過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • java 打印一字符串,并在main()方法內(nèi)調(diào)用它

    java 打印一字符串,并在main()方法內(nèi)調(diào)用它

    編寫一個方法(名字自定,但要符合Java編碼規(guī)范),方法內(nèi)打印一字符串,并在main()方法內(nèi)調(diào)用它。
    2017-02-02
  • SpringBoot 集成 Memcached的方法示例

    SpringBoot 集成 Memcached的方法示例

    這篇文章主要介紹了SpringBoot 集成 Memcached的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • 解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題

    解決rror updating database.Cause:java.sql.SQLSyntaxE

    這篇文章主要介紹了解決rror updating database.Cause:java.sql.SQLSyntaxErrorException問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringSceurity實現(xiàn)短信驗證碼功能的示例代碼

    SpringSceurity實現(xiàn)短信驗證碼功能的示例代碼

    這篇文章主要介紹了SpringSceurity實現(xiàn)短信驗證碼功能的示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • JAVA中使用JSON進行數(shù)據(jù)傳遞示例

    JAVA中使用JSON進行數(shù)據(jù)傳遞示例

    本篇文章主要介紹了JAVA中使用JSON進行數(shù)據(jù)傳遞示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • Android內(nèi)存泄漏實戰(zhàn)解析

    Android內(nèi)存泄漏實戰(zhàn)解析

    Java是垃圾回收語言的一種。這篇文章主要介紹了Android內(nèi)存泄漏 的相關(guān)資料,需要的朋友可以參考下
    2016-10-10

最新評論