时间:2021-05-20
前段时间在网上看到了一篇关于ThreadLocal内存泄漏的文章
于是个人也研究了下ThreadLocal 对象,其原理是:
ThreadLocal 定义的变量值 会存储在当前线程的一个map集合中
这个map里面存储的是Entity对象 , Entity对象的key是当前ThreadLocal对象的弱引用,
value则是ThreadLocal变量的值
这就产生了一个问题:
如果ThreadLocal变量的强引用丢失了 map里面的弱引会失效 gc就回收ThreadLocal对象
那么 ThreadLocal的value 会在一直在map里面 直到Thread被回收 却因为key释放了没有办法获得
其实jdk针对此问题也做了一定范围的处理 就是key为null的entity会被覆盖或清除
当然我们使用的时候也应该注意 下面的几种用法都是有问题的:
1.同一个变量名多次new
ThreadLocal a=new ThreadLocal();
.....
a=new ThreadLocal();
2.变量局部产生
public void func(){
ThreadLocal a=new ThreadLocal();
}
或
for(int i=0;i<100;i++){
ThreadLoal b=new ThreadLocal();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
如果说ThreadLocal的话,那肯定就会涉及到内存泄漏,为啥嘞因为吧啦吧啦~ThreadLocal解决了什么问题呢?它是为了解决对象不能被多线程共享
概要不要以为Python有自动垃圾回收就不会内存泄漏,本着它有“垃圾回收”我有“垃圾代码”的精神,现在总结一下三种常见的内存泄漏场景。无穷大导致内存泄漏如果把内
IOS常见内存泄漏以及解决方案整理了几个内存泄漏的例子,由于转载地址已经找不到了,在这里就不一一列出来了。1OC和CF转化出现的内存警告?123456CFStr
问:Cppunit可以测试内存泄漏吗?答:内存泄漏适合于集成后进行,并且也有专门的工具。对于某个代码单元来说,内存泄漏是难于测试的,单元内的未释放内存不等于会有
什么是内存泄漏内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出。内存泄漏的的原因可能有多种分配给应用程序的内存本身过小。而应用的业务代码,确实需要生