ThreadLocal内存泄漏的一些分析

ThreadLocal引用图

ThreadLocal内存泄漏的一些分析_第1张图片

    如上图中的虚线所示,就是弱引用。

    因为Thread中的ThreadLocalMap是Thread的成员属性,如果Thread对象没有被回收之前,这个map对象是一直存在的,也就是map里边的entry也是一直存在的哈。

    使用线程池的场景一定要注意ThreadLocal对象的清除!!!

    1.如果不使用弱引用,那么在栈中,引用到ThreadLocal对象的引用置空之后,ThreadLocal因为还有Entry中的key对它的强引用,导致ThreadLocal不能被回收,这样会导致内存泄露

    2.key使用弱引用之后,一旦程序中没有强引用指向threadlocal对象,那么entry中的key弱引用就会被回收,此时还有一个问题,虽然threadlocal对象本身被回收了,但是它之前关联的value对象(ThreadLocal引用关联的对象)并没有被回收,因为Thread还在,threadmap还在,entry还在,value还在,value指向的对象自然没有被回收。

    针对这种情况,在threadlocal的get,set,remove方法中,针对key为空的entry对象,是有做处理的,最终会把这些key为空的对象处理掉,从而使得实际的value可以得到回收

    threadlocalmap的expungeStaleEntry方法就是有处理这些key为空的逻辑

你可能感兴趣的:(Java,java)