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