threadlocal裡面使用了乙個存在弱引用的
map,
當釋放掉
threadlocal
的強引用以後
,map
裡面的value
卻沒有被**
.而這塊
value
永遠不會被訪問到了
. 所以存在著記憶體洩露
.最好的做法是將呼叫
threadlocal
的remove
方法.在threadlocal的生命週期中
,都存在這些引用
. 看下圖
: 實線代表強引用
,虛線代表弱引用
每個thread中都存在乙個
map, map
的型別是
threadlocal.threadlocalmap. map
中的key
為乙個threadlocal
例項.
這個map
的確使用了弱引用
,不過弱引用只是針對
key.
每個key
都弱引用指向
threadlocal.
當把
threadlocal
例項置為
null以後,
沒有任何強引用指向
threadlocal例項,
所以threadlocal
將會被gc
**. 但是,
我們的value
卻不能**
,因為存在一條從
current thread
連線過來的強引用
. 只有當前
thread
結束以後
, current thread
就不會存在棧中
,強引用斷開
, current thread, map, value
將全部被
gc**
.所以得出乙個結論就是只要這個執行緒物件被gc**,就不會出現記憶體洩露,但在
threadlocal
設為null
和執行緒結束這段時間不會被**的,就發生了我們認為的記憶體洩露。其實這是乙個對概念理解的不一致,也沒什麼好爭論的。最要命的是執行緒物件不被**的情況,這就發生了真正意義上的記憶體洩露。比如使用執行緒池的時候,執行緒結束是不會銷毀的,會再次使用的。就可能出現記憶體洩露。
ps.j**a為了最小化減少記憶體洩露的可能性和影響,在
threadlocal
的get,set
的時候都會清除執行緒
map裡所有
key為
null
的value
。所以最怕的情況就是,
threadlocal
物件設null
了,開始發生「記憶體洩露」,然後使用執行緒池,這個執行緒結束,執行緒放回執行緒池中不銷毀,這個執行緒一直不被使用,或者分配使用了又不再呼叫
get,set
方法,那麼這個期間就會發生真正的記憶體洩露。
ThreadLocal引起記憶體洩露總結
我們都知道threadlocal能給每乙個執行緒建立乙個副本,確保多個執行緒訪問資源的安全性。但是threadlocal使用不當會造成記憶體洩漏。首先分析一下threadlocal記憶體洩漏原理。threadlocal底層其實是乙個threadlocalmap,是以形式儲存變數副本的。但是由於key...
syslog可能引起得問題 引起脹氣的原因有哪些?
肚子裡有脹氣,在日常生活中,並不不少見。總是感覺肚子脹脹的,坐也不是,站也不是,就覺得很難受,偶爾發生,對生活和身體都沒什麼太大影響。若是經常發生脹氣,可不能大意,問題也許並不簡單,需要早點了解原因,也能趁早改善問題。到底引起脹氣的原因有哪些?下面就來好好帶你了解一下。引起脹氣的原因究竟是什麼?脹氣...
引起電腦自動重啟的可能原因
一 軟體 1 病毒破壞 自從有了計算機以後不久,計算機病毒也應運而生。當網路成為當今社會的資訊大動脈後,病毒的傳播更加方便,所以也時不時的干擾和破壞我們的正常工作。比較典型的就是前一段時間對全球計算機造成嚴重破壞的 衝擊波 病毒,發作時還會提示系統將在 60秒後自動啟動。其實,早在 dos時代就有不...