ThreadLocal内存泄漏
看到有人说Threadlocal会导致内存溢出,所以来分析一下源码(只展示关键部分)
因为很简单,也没必要搞什么专业的工具来测试,因为没必要,直接看源码:
1、ThreadLocal所存储的数据最终存在Entry对象,Entry对象虽然继承自弱引用,但是只和key值是弱引用关系,与value值是强引用关系。
所以,关系是:ThreadLocalMap拥有Entry的引用,Entry拥有value的引用。
2、ThreadLocal并没有ThreadLocalMap的引用,因此即使将ThreadLocal声明成Static也不会对ThreadLocalMap造成任何影响。
但是,观察ThreadLocal的set函数,会发现,Thread(当前线程)中有ThreadLocalMap的引用,
结果显而易见:只要当前线程不死,资源就无法释放,一旦线程卡死,那么就会导致当前线程的值无法回收。
3、实在没办法,调用一下remove函数即可,函数最终会将对象置空
结论:
这样分析下来,问题并不大,在后台开发中,几乎想象不出来你做了啥,才能把线程卡死;
如果非要说高并发,那需要思考高并发的处理方案,而不是去思考如何修改ThreadLocal;
就正常的开发场景,也很难想象,有谁会出于业务需求,往ThreadLocal中丢大批量数据,然后还让线程长期工作。
理解内存泄漏,重点理解什么是强引用即可,因为弱引用和软引用需要声明,平时用不到,不去理解也无所谓,有需求了或者遇到了,自然会去理解。
new一个字符串,字符串名字叫a,a就有了这个字符串的强引用,只要a还存在,这个字符串就不会被销毁;
给a赋值一个新的字符串,原先的字符串没用了,那原先的字符串就可以被销毁。
使用弱引用和软引用,就是为了在内存不足的时候,优先清除那些看起来不是非常重要的数据,即便拥有引用。