1. 程式人生 > 程式設計 >ThreadLocal記憶體洩漏常見要點解析

ThreadLocal記憶體洩漏常見要點解析

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

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。