ThreadLocal記憶體洩漏怎麼回事

iiiiiiiivan發表於2024-10-17

ThreadLocal

本地執行緒,呼叫set方法往裡面存的值,是每個執行緒互相隔離,互不影響的,每個執行緒都有一塊儲存ThreadLocal資料的地方叫做ThreadLocalMap,這個變數專門用於儲存當前執行緒的map資料,呼叫ThreadLocal.set方法的時候,就是往這個ThreadLocalMap裡面儲存一個一個的entry,由key和value組成,key是當前的ThreadLocal,value是set()裡面的值。
程式碼中常用到的ThreadLocal只是暴露出來,方便用於獲取當前Thread物件內的ThreadLocalMap的工具類
ThreadLocal模型如下:
image

記憶體洩露

如果線上程池中使用ThreadLocal,會出現記憶體洩露的問題,因為當ThreadLocal物件使用完之後,應該要把設定的key,value,也就是Entry物件回收,但執行緒池中的執行緒不會回收,而執行緒物件是透過強引用指向ThreadLocalMap,ThreadLocalMap是透過強引用指向Entry物件,執行緒不被回收,Entry物件也就不會被回收,從而出現記憶體洩露

解決辦法

在使用ThreadLocal物件以後,手動呼叫ThreadLocal的remove方法,手動清除Entry物件

相關文章