ThreadLocal記憶體洩漏需要注意的

2022-01-26 14:47:18 字數 699 閱讀 3810

前段時間在網上看到了一篇關於threadlocal記憶體洩漏的文章

於是個人也研究了下threadlocal 物件,其原理是:

threadlocal 定義的變數值 會儲存在當前執行緒的乙個map集合中

這個map裡面儲存的是entity物件  , entity物件的key是當前threadlocal物件的弱引用,

value則是threadlocal的值

這就產生了乙個問題:

如果threadlocal變數的強引用丟失了  map裡面的弱引會失效  gc就**threadlocal物件

那麼 threadlocal的value 會在一直在map裡面 直到thread被**  卻因為key釋放了沒有辦法獲得 

其實jdk針對此問題也做了一定範圍的處理   就是key為null的entity會被覆蓋或清除

當然我們使用的時候也應該注意  下面的幾種用法都是有問題的:

1.同乙個變數名多次new

threadlocal  a=new threadlocal();

a=new threadlocal();

2.變數區域性產生

public void func(){

threadlocal a=new threadlocal();

或for(int i=0;i<100;i++){

threadloal b=new threadlocal();

ThreadLocal記憶體洩漏

重新上傳 取消threadlocal threadlocal的實現是這樣的 每個thread維護乙個threadlocalmap對映表,這個對映表的key是threadlocal例項本身,value是真正需要儲存的object。也就是說threadlocal本身並不儲存值,它只是作為乙個key來讓執...

ThreadLocal 記憶體洩漏

個人對記憶體洩漏的理解 如果乙個我用不到物件一直在記憶體裡,那麼就出現記憶體洩漏了。簡單說一下theadlocal實現原理 通過執行緒私有的空間來儲存資料,即在thread類裡有乙個threadlocalmap型別的變數 threadlocal values pertaining to this t...

ThreadLocal 記憶體洩漏

theadlocal 記憶體洩漏的根源是 由於threadlocalmap的生命週期跟thread一樣長,如果沒有手動刪除對應的key就會導致記憶體洩漏,而不是因為弱引用 一 threadlocalmap的 key 為 threadlocal 弱引用 二 threadlocal正確的使用方法 1 每...