ThreadLocal記憶體洩漏常見要點解析
阿新 • • 發佈:2020-11-17
前段時間在網上看到了一篇關於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();
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。