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