1. 程式人生 > >ThreadLocal 與記憶體洩漏

ThreadLocal 與記憶體洩漏

【Q】為什麼不能使用強引用?

先看看使用強引用會出現什麼問題。

ThreadLocalMap 中,value 作為一個本地變數,應該不會說總在使用,因此用完之後最好清理這個 Entry。

如果執行緒執行很快,執行緒退出後 ThreadLocalMap 不存在了自然不用再管其內部屬性了;但如果是長時間存在的執行緒,在併發量大的情況下,每個執行緒都持有一個無用物件無法回收,造成記憶體洩漏。(當然可以手動回收)

ThreadLocalMap 使用弱引用的 key 是一個很大的進步,能夠在 set 與 get 的過程中檢測到無效的 key,從而清理連續段中包含無效 key 的 Entry。

但這種清理工作並不是每次都及時的,對於長時間執行的執行緒,如果 key 引用的物件被回收之後,不再呼叫 set 與 get 方法,那麼 value 物件就一直不會清理,將造成記憶體洩漏。

解決辦法就是用完之後呼叫 remove 方法進行清理。

PS:如果 ThreadLocal 物件是 static 型別,弱引用將形同虛設,類似於上述強引用的問題,可以手動回收。