对于一个ThreadLocal对象,通常有两个引用指向它:
关键是弱引用,如果没有外部强引用,就会自动回收。该值是一个强引用,引用链如下:
所以该值只有在线程回收时才会被回收。否则该值始终存在,但关闭每个线程是不现实的。在线程池中,大多数线程伴随着系统的整个循环,因此值可能会导致泄漏。
解决方案是在执行set()、get()和remove()时清理ThreadLocalMap:
真正回收值的是方法expungeStaleEntry()Remove和Set方法都会调用此方法。
为了避免内存泄漏,ThreadLocal不仅使用弱引用来管理key,而且每次操作时都会检查key是否被回收,然后回收value。
1.强参考
2.软参考
4
上一篇:苹果手机内存不足怎么清理