ThreadLocal导致内存泄漏的原因其实就是他在堆上存储的ThreadLocalMap中的K-V部分:
ThreadLocalMap的key就是ThreadLocal对象,他有两个引用源,一个是栈上的ThreadLocal引用,一个是ThreadLocalMap中的Key对他的引用。
value只有一条引用,就是从Thread对象过来的。
所以就会产生以下两种情况:
一、栈上的ThreadLocal ref引用不再使用了,但是因为ThreadLocal对象还有一条引用链导致他无法被回收,时间长了可能就发生OOM.
二、Thread对象如果一直在被使用,比如在线程中被重复使用,那么他的引用链也会一直存咋,就会导致ThreadLocalMap无法被回收
解决方法:
为了解决这个问题,ThreadLocalMap使用了弱引用,这样ThreadLocal对象就可以在下次GC时被垃圾回收掉了,可以很大程度上避免因为ThreadLocal的使用导致的OOM问题,但是没法彻底避免。
第二种因为Thread对象一直存在导致的OOM可以采用每个ThreadLocal用完之后,手动调用一下remove,就可以在下次GC时把Entry清理掉