您好,欢迎访问一九零五行业门户网

java ThreadLocal内存泄漏如何解决

1、泄漏实例
threadlocalmap的静态内部类entry:
    static class entry extends weakreference<threadlocal<?>> {        /** the value associated with this threadlocal. */        object value;         entry(threadlocal<?> k, object v) {            super(k);            value = v;        }    }
threadlocalmap使用静态内部类entry实现<k,v>存储,而entry继承weakreference类,所以threadlocalmap中的key其实是threadlocal的一个弱引用。
 正因为threadlocalmap以threadlocal的弱引用作为key,在这个threadlocal没有外部强引用的时候,会被gc。这时候,threadlocalmap会出现一个key为null的entry,理所当然的,这个entry的value将永远没办法被访问到。
在这种情况下,如果当前工作线程一直没有结束,那这个key为null的value因为被entry强引用,而entry被当前线程的threadlocalmap强引用,导致这个value永远无法被gc,造成内存泄漏。
2、解决办法
threadlocalmap的cleansomeslots(),expungestaleentry()方法都能清除key为null的value。 在threadlocal的set(),get(),remove()方法中,都会调用cleansomeslots()或expungestaleentry()来清除threadlocalmap中所有key为null的value。
以上就是java threadlocal内存泄漏如何解决的详细内容。
其它类似信息

推荐信息