網上有這樣一個例子:
如果用線程池來操作ThreadLocal 對象確實會造成內存泄露, 因為對于線程池里面不會銷毀的線程, 里面總會存在著<threadlocal, localvariable="">的強引用,因為final static 修飾的 ThreadLocal 并不會釋放, 而ThreadLocalMap 對于 Key 雖然是弱引用, 但是強引用不會釋放,弱引用當然也會一直有值,同時創建的LocalVariable對象也不會釋放, 就造成了內存泄露; 如果LocalVariable對象不是一個大對象的話, 其實泄露的并不嚴重, 泄露的內存 = 核心線程數 * LocalVariable對象的大小;
所以,為了避免出現內存泄露的情況,ThreadLocal提供了一個清除線程中對象的方法,即 remove,其實內部實現就是調用 ThreadLocalMap 的remove方法:
找到Key對應的Entry,并且清除Entry的Key(ThreadLocal)置空,隨后清除過期的Entry即可避免內存泄露。