我们都知道ThreadLocal能给每一个线程创建一个副本,确保多个线程访问资源的安全性。但是ThreadLocal使用不当会造成内存泄漏。首先分析一下ThreadLocal内存泄漏原理。
ThreadLocal底层其实是一个ThreadLocalMap,是以<key, value>形式存储变量副本的。但是由于key对象使用的是弱引用,所以JVM每次GC都会回收key对象。导致key对象为null。但是value值还一直存在堆内存中。就会引起堆内存泄露。
为避免ThreadLocal 出现内存泄露,每次使用完成后必须调用remove()方法将其释放。