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内存泄漏如何解决的详细内容。