關於 ThreadLocal 記憶體洩露

2021-10-09 07:57:30 字數 758 閱讀 5019

在使用 threadlocal 的時候,一般我們的**都是這樣寫的:

public

class

threadlocaldemo

public

static long getuserid()

public

static

void

remove()

}

然後處理業務的是乙個執行緒池,有乙個結果就是 「threadlocal 引用」 context(靜態變數) 和 「thread 引用」(執行緒池裡的執行緒)會常駐記憶體。引用關係如圖所示:

雖然 key 使用了弱引用,但是 key 指向的 「threadlocal 物件」還一直被「threadlocal 引用」給引用著,這樣 threadlocal 裡的 expungestaleentry 方法是無法進行清理的(清理 key 為 null 的元素)。

threadlocal 的使用場景不應該圖省事,就用來傳遞業務引數,這樣增加了程式複雜度,**可讀性降低,處理不當還會記憶體洩漏,適用於一些日誌、監控類的場景。

try

finally

weakreference:

軟引用、弱引用、虛引用-他們的特點及應用場景

更多參考:

對threadlocal實現原理的一點思考

關於ThreadLocal記憶體洩漏的問題

引用 對於threadlocal,我的理解是 每個執行緒thread物件裡面有個threadlocalmap 可以當成map看 map物件裡面的key就是threadlocal物件,value是threadlocal set進去的object物件。如果在邏輯執行完成後,key value鍵值對沒有從...

ThreadLocal記憶體洩漏

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

ThreadLocal 記憶體洩漏

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