哪些地方可能存在内存泄露
ThreadLocal 的实现原理:每一个 Thread 维护一个 ThreadLocalMap,key 为使用弱引用的 ThreadLocal 实例,value 为线程变量的副本,这些对象之间的引用关系如下:
实心箭头表示强引用,虚心箭头表示弱引用
ThreadLocal 的内存泄露发生在 Entry 上,我们现在来详细分析 Entry。
对于 Entry 的 key 来说,它是 ThreadLocal 对象,它有两个引用源,一个是栈内存上的 ThreadLocal Ref,一个是 Entry 中的 key,如下:
对于 Entry 的 value 而言它就只有一条引用链:
对于 Entry 来说,由于存在 key 和 value 两个引用路径,所以这里就会有两种情况: