ThreadLocal可能引起的記憶體洩露

2022-10-11 15:33:15 字數 1638 閱讀 9702

threadlocal裡面使用了乙個存在弱引用的

map,

當釋放掉

threadlocal

的強引用以後

,map

裡面的value

卻沒有被**

.而這塊

value

永遠不會被訪問到了

. 所以存在著記憶體洩露

.最好的做法是將呼叫

threadlocal

的remove

方法.在threadlocal的生命週期中

,都存在這些引用

. 看下圖

: 實線代表強引用

,虛線代表弱引用

每個thread中都存在乙個

map, map

的型別是

threadlocal.threadlocalmap. map

中的key

為乙個threadlocal

例項.

這個map

的確使用了弱引用

,不過弱引用只是針對

key.

每個key

都弱引用指向

threadlocal.

當把

threadlocal

例項置為

null以後,

沒有任何強引用指向

threadlocal例項,

所以threadlocal

將會被gc

**. 但是,

我們的value

卻不能**

,因為存在一條從

current thread

連線過來的強引用

. 只有當前

thread

結束以後

, current thread

就不會存在棧中

,強引用斷開

, current thread, map, value

將全部被

gc**

.所以得出乙個結論就是只要這個執行緒物件被gc**,就不會出現記憶體洩露,但在

threadlocal

設為null

和執行緒結束這段時間不會被**的,就發生了我們認為的記憶體洩露。其實這是乙個對概念理解的不一致,也沒什麼好爭論的。最要命的是執行緒物件不被**的情況,這就發生了真正意義上的記憶體洩露。比如使用執行緒池的時候,執行緒結束是不會銷毀的,會再次使用的。就可能出現記憶體洩露。  

ps.j**a為了最小化減少記憶體洩露的可能性和影響,在

threadlocal

的get,set

的時候都會清除執行緒

map裡所有

key為

null

的value

。所以最怕的情況就是,

threadlocal

物件設null

了,開始發生「記憶體洩露」,然後使用執行緒池,這個執行緒結束,執行緒放回執行緒池中不銷毀,這個執行緒一直不被使用,或者分配使用了又不再呼叫

get,set

方法,那麼這個期間就會發生真正的記憶體洩露

ThreadLocal引起記憶體洩露總結

我們都知道threadlocal能給每乙個執行緒建立乙個副本,確保多個執行緒訪問資源的安全性。但是threadlocal使用不當會造成記憶體洩漏。首先分析一下threadlocal記憶體洩漏原理。threadlocal底層其實是乙個threadlocalmap,是以形式儲存變數副本的。但是由於key...

syslog可能引起得問題 引起脹氣的原因有哪些?

肚子裡有脹氣,在日常生活中,並不不少見。總是感覺肚子脹脹的,坐也不是,站也不是,就覺得很難受,偶爾發生,對生活和身體都沒什麼太大影響。若是經常發生脹氣,可不能大意,問題也許並不簡單,需要早點了解原因,也能趁早改善問題。到底引起脹氣的原因有哪些?下面就來好好帶你了解一下。引起脹氣的原因究竟是什麼?脹氣...

引起電腦自動重啟的可能原因

一 軟體 1 病毒破壞 自從有了計算機以後不久,計算機病毒也應運而生。當網路成為當今社會的資訊大動脈後,病毒的傳播更加方便,所以也時不時的干擾和破壞我們的正常工作。比較典型的就是前一段時間對全球計算機造成嚴重破壞的 衝擊波 病毒,發作時還會提示系統將在 60秒後自動啟動。其實,早在 dos時代就有不...