一、ThreadLocal為什么會導致內存泄露
1.1、ThreadLocalMap的基本結構
????????ThreadLocalMap是ThreadLocal的內部類,沒有實現Map接口,用獨立的方式實現了Map的功能,其內部的Entry也是獨立實現的。源碼如下:
1.2、ThreadLocal引用示意圖
1.3、原因
? ? ? ? ThreadLocalMap使用ThreadLocal的弱引用作為key,當ThreadLocal的變量引用被手動置位null的時候,即一個ThreadLocal沒有外部強引用來引用它,當GC回收垃圾時,ThreadLocal一定會被回收掉,這樣的話,ThreadLocalMap中就出現了key為null的Entry,這樣的話線程就無法訪問這個key為null的Entry中的value,如果當前線程再遲遲不結束的話(比如核心線程),這些key為null的Entry的value就會一直存在一條強引用鏈,即:Thread ref===>Thread obj===>ThreadLocalMap obj===>Entry===>value===>Object obj,當大量的這種強引用鏈存在時,就會導致內存溢出,即內存泄露最終會導致內存溢出。
1.4、解決
程序員在編碼過程中 ,注意使用ThreadLocal時,要進行手動remove;