ThreadLocal為什么會導致內存泄漏?

問題引出:
ThreadLocal是為了解決什么問題而產生的?
ThreadLocal發生內存泄漏的根本原因是什么?
如何避免內存泄漏的發生?

定義

??為了解決多個線程同時操作程序中的同一個變量而導致的數據不一致性的問題。
??假設現在有兩個線程A和B,想要同時使用程序中的某個變量,如果想要保持這個變量的數據一致性,該怎么做?
(1)首先最直接的方法就是對變量進行加鎖,一次只允許一個線程進行操作;但是這種加鎖的方式效率不高,當有很多線程想要操作變量時,沒有持有鎖的線程只能等待。
(2)而Threadlocal解決的方式就比較優雅了,它是怎么做的呢?一句話概括:為每一個線程創建了變量的副本。
大白話解釋:給兩個線程分別分配了一個容器,線程在各自的容器中對各自的變量副本進行操作,互不影響,實現了線程之間的隔離。

類圖

??在ThreadLocal的類中,存在一個核心的內部類ThreadLocalMap;在ThreadLocalMap的類中,也存在著一個核心的內部類Entry。
Threadllocal

圖解

??對于每一個線程,都維護著自己的ThreadLocalMap,而這個ThreadLocalMap中存放的變量就是Entry類型的,Entry類型的變量的key就是一個threadLocal對象,value就是你想要存的值。如下圖所示:
ThreadLocal圖解

思考:
一個ThreadLocal對象是否可以對應多個值(Object v)?

內存泄漏

在宏觀上,內存泄漏是指,由于錯誤或者疏忽,未能正確釋放已經不再使用的內存。
那么ThreadLocal發生內存泄漏的根本原因是什么呢?
根本原因在于ThreadLocalMap中存的是一個個的Entry對象,問題就出在這個Entry對象中。

static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;}}

仔細看,Entry對象中的ThreadLocal變量是一個弱引用,這個倒沒問題,jvm會在合適的時機將其內存自動進行回收;但是Entry對象中的Object值是一個強引用,問題就出現在這里,jvm寧愿報內存溢出的錯,也不愿意主動去回收一個強引用的內存。
這就會出現一種什么情況呢?我的ThreadLocal變量的內存已經被jvm回收掉了,在ThreadLocalMap中已經不再需要以當前被回收掉的ThreadLocal變量為key的Entry了,但是這個Entry中的value一直得不到回收,因為它是一個強引用。由此發生了內存泄漏。

思考:ThreadLocal一定會發生內存泄漏嗎?
答:不一定。解答此問題的關鍵在于要明白ThreadLocal的生命周期是和當前線程的生命周期是一樣的。
如果當前線程被銷毀了,那么線程中的所有變量都將被銷毀,包括ThreadLocalMap對象、Entry對象等等;
如果當前線程沒有被銷毀,它只是被回收到線程池中了(比如當前線程是一個核心線程),則就會發生內存泄漏。

內存泄漏的避免

??在使用完ThreadLocal之后,調用它的remove方法,主動去清除不再使用的內存。

參考鏈接:
Threadlocal為什么會有內存泄漏泄漏,如何解決
java中的引用

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14933.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何獲取一個城市或者一個區域的玫瑰風向圖?

玫瑰風向圖是一種直觀展示風向和風速的圖形工具&#xff0c;它在氣象學、城市規劃、農業等領域都有廣泛的應用。那么&#xff0c;如何獲取某個城市或某個區域的玫瑰風向圖呢&#xff1f; 首先&#xff0c;我們可以借助互聯網資源獲取玫瑰風向圖。現代網絡技術發達&#xff0c;…

前端 防抖和節流

在前端開發中&#xff0c;防抖&#xff08;Debounce&#xff09;和節流&#xff08;Throttle&#xff09;是兩種常用的性能優化技術&#xff0c;尤其在處理頻繁觸發的事件時顯得尤為重要。無論是在用戶輸入、窗口調整大小&#xff0c;還是滾動事件中&#xff0c;這兩種技術都可…

3D 生成重建011-LucidDreamer 優化SDS過平滑結果的一種探索

3D 生成重建011-LucidDreamer 優化SDS過平滑結果的一種探索 文章目錄 0論文工作1論文方法2 效果 0論文工作 文本到3D生成的最新進展標志著生成模型的一個重要里程碑&#xff0c;為在各種現實場景中創建富有想象力的3D資產打開了新的可能性。雖然最近在文本到3D生成方面的進展…

自建公式,VBA在Excel中解一元一次方程

自建公式,VBA在Excel中解一元一次方程 文章目錄 前言一、運行效果圖二、操作思路三、代碼1.去除方程中未知數,將未知數轉為“*0”2.計算方程中常數3.計算方程中未知數的系數一,先將未知數替換成“*1”4.計算方程中未知數的系數二5.計算方程得數前言 小學必考內容:一元一次…

掌握Python基本語法的終極指南【基本語法部分】

一、基本語法部分 1.簡單數據類型 1.1字符串類型及操作 字符串訪問&#xff1a; 1.索引訪問 mystr"Hello world" #索引訪問 print(mystr[0]) #H print(mystr[-1]) #d print(mystr[-7]) #o print(mystr[6]) #w 2.切片訪問 [頭下標&#xff1a;尾下標] &#x…

齊護K210系列教程(三十二)_在線模型訓練

在線模型訓練 概念理解準備工作1 采集圖像1.1 圖像要求1.2 使用K210采集圖片 2 標注圖像3 打包數據集4 上傳數據4.1創建項目4.1.1圖像分類創建項目4.1.2圖像檢測創建項目 4.2上傳數據4.2.1分類檢測上傳數據4.2.2圖像檢測上傳數據 5 訓練模型6 部署模型以及測試7 測試效果7.1圖像…

leetcode 152. 乘積最大子數組

. - 力扣&#xff08;LeetCode&#xff09; 給你一個整數數組 nums &#xff0c;請你找出數組中乘積最大的非空連續 子數組 &#xff08;該子數組中至少包含一個數字&#xff09;&#xff0c;并返回該子數組所對應的乘積。 測試用例的答案是一個 32-位 整數。 示例 1: 輸入…

MongoDB關系處理:優化數據管理、提升性能的最佳實踐

MongoDB 是一種 NoSQL 數據庫&#xff0c;它使用文檔模型來存儲數據&#xff0c;這與關系型數據庫&#xff08;RDBMS&#xff09;有顯著不同。本文將詳細介紹 MongoDB 中的關系處理&#xff0c;包括基本語法、命令、示例、應用場景、注意事項和總結。 基本語法 文檔和集合 M…

30.靜態代碼分析工具clang-tidy

文章目錄 基本介紹安裝clang-tidy使用clang-tidy配置文件和格式文件配置文件格式文件使用配置文件和格式化文件 在代碼中設置排除clang-tidy檢測reference 歡迎訪問個人網絡日志&#x1f339;&#x1f339;知行空間&#x1f339;&#x1f339; 基本介紹 clang-tidy 是一個基于…

JDBC總結

目錄 JDBC(java database connection) JDBC連接數據庫步驟: 1. 在項目中添加jar文件,如圖所示 2.加載驅動類 向數據庫中插入數據代碼示例: 第一種: 第二種: 查詢操作 : 第一種: 第二種: JDBC(java database connection) java數據庫連接.api(應用程序編程接口) ,可…

Java中的垃圾回收機制

在Java編程語言中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;機制是內存管理的一個核心部分。它的主要目標是自動釋放那些不再被程序使用的對象所占用的內存空間&#xff0c;從而防止內存泄漏&#xff0c;并確保程序的穩定運行。下面&#xff0c;我將…

一文講清!傳統企業的進銷存管理難題該怎么解決?

有沒有開源的進銷存軟件啊&#xff1f; 確實&#xff0c;市面上存在不少開源的進銷存軟件。但客觀地講&#xff0c;開源軟件往往面臨著安全隱患&#xff0c;因為代碼公開&#xff0c;容易成為黑客攻擊的目標。此外&#xff0c;開源軟件的功能模塊通常較為固定&#xff0c;難以…

初出茅廬的小李博客之MQTT.fx客戶端接入EMQX Platform

EMQX Platform 概覽 EMQX Platform 是 EMQ 推出的一款面向物聯網領域的 MQTT 消息中間件產品。作為全球首個 MQTT 5.0 消息云服務&#xff0c;EMQX Platform 提供了一站式運維代管、獨有隔離環境的 MQTT 消息服務。在萬物互聯的時代&#xff0c;EMQX Platform 可以幫助您快速構…

python數據類型之列表

目錄 1.創建列表 2.列表基礎操作 常用操作 對列表元素順序隨機打亂 列表下標和切片 字符串分割為列表 列表位移 列表切片替換 3.列表內置方法 4.列表排序 簡單排序 使用key參數按指定規則排序 二維列表排序 自定義排序規則函數 5.列表排序算法 選擇排序 柱狀圖…

C# 利用Xejen框架源碼,我們來開發一個基于Dapper技術的數據庫通用的幫助訪問類,通過Dapper的增刪改查,可以訪問Sqlite數據庫

Dapper 是一個輕量級的對象關系映射&#xff08;ORM&#xff09;工具&#xff0c;適用于 .NET 平臺。它由 Stack Overflow 團隊開發&#xff0c;旨在提供簡單、高效的數據訪問功能。與其他重量級 ORM&#xff08;如 Entity Framework&#xff09;相比&#xff0c;Dapper 更加輕…

基于Python圖像增強算法:低光增強+圖像修復+超分辨率重建

歡迎大家點贊、收藏、關注、評論啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代碼。 文章目錄 一項目簡介 二、功能三、系統四. 總結 一項目簡介 一、項目背景與意義 在圖像處理與計算機視覺領域&#xff0c;圖像增強技術是提高圖像質量和可用性的重要手段。在實…

單片機io擴展

輸入輸出擴展 i2c擴展 方案1:PCF8575 PCF8575雙向IO口擴展模塊 16位輸入輸出I2C通訊 單片機級聯擴展板 方案2&#xff1a;PCA955A 輸出擴展 74HC595 io口擴展模塊輸出口擴展 參考鏈接 中微愛芯發[2004] 1號           簽發人&#xff1a; (szlcsc.com)https://…

? Vscode和Idea都可以使用的-AI插件(官方-百度出的)

? Vscode和Idea都可以使用的-AI插件&#xff08;官方-百度出的&#xff09; 最新AI特別火&#xff0c;給大家推薦一下最新出的VScode插件&#xff0c;輔助我們寫代碼&#xff01; 1、下載地址&#xff1a; > https://comate.baidu.com/zh/shopping?inviteCodefkzlak8f …

jmeter中Ultimate Thread Group設計梯度壓測場景

Ultimate Thread Group Ultimate Thread Group 線程組是模擬波浪式壓測或者階梯式負載壓測 1、Start Threads Count&#xff1a;線程數量 2、Initial Delay&#xff0c;sec&#xff1a;每組開始添加到測試執行之前的延遲&#xff08;xx秒開始啟動線程&#xff09; 3、Startu…

python中的線程并行

文章目錄 1. 單線程2. 線程池ThreadPoolExecutor 1. 單線程 現在有1154張圖片需要順時針旋轉后保存到本地&#xff0c;一般使用循環1154次處理&#xff0c;具體代碼如下所示&#xff0c;img_paths中存儲1154個圖片路徑&#xff0c;該代碼段耗時約用97ms。 t1time.time() for …