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