【引用】https://www.jianshu.com/p/b74597032598
对于ThreadLocal,我的理解是:
每个线程Thread对象里面有个ThreadLocalMap(可以当成Map看),map对象里面的key就是ThreadLocal对象,value是ThreadLocal#set进去的Object对象。
如果在逻辑执行完成后,key-value键值对没有从map对象中移除,map就会一直持有该键值对,对于线程池中的线程对象来说,这种键值对越积越多,无法释放,就造成了内存泄漏,最终导致内存溢出。
ThreadLocal最佳实践
建议使用ThreadLocal的场景:
- 当需要存储线程私有变量的时候。
- 当需要实现线程安全的变量时。
- 当需要减少线程资源竞争的时候。
综合上面的分析,我们可以理解ThreadLocal内存泄漏的前因后果,那么怎么避免内存泄漏呢?
答案就是:每次使用完ThreadLocal,建议调用它的remove()方法,清除数据。