threadLocal的内存泄漏及解决方法
定义:不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄露。
Thread类维护了一个ThreadLocalMap。
ThreadLocal设置本地变量,实际上是在ThreadLocalMap创建了一个key-value。key是ThreadLocal,value是值,
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(1);
ThreadLocal和ThreadLocalMap中的key是弱引用。
当没有强引用指向ThreadLocal时,ThreadLocal就会被回收,导致ThreadLocalMap中的key变为null,但是value和其指向的对象之间是强引用,由于value无法访问,导致对象不可回收。
长时间累积就会有内存泄漏的问题。
ThreadLocalMap中当key为null,在下一次ThreadLocalMap调用set(),get(),remove()方法的时候会被清除value值。
ThreadLocal正确的使用方法
- 每次使用完ThreadLocal都调用它的remove()方法清除数据(推荐)
- 将ThreadLocal变量定义成private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉 。
ThreadLocal的内存泄露?什么原因?如何避免? - 知乎
ThreadLocal为什么会导致内存泄漏? - Chen洋 - 博客园