前段時間在網上看到了一篇關於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 每...