对于ThreadLocal的一些个人理解

ThreadLocal为什么会导致内存泄漏?

首先给出结论:在ThreadLocal引起的内存泄漏问题中,真正导致内存泄漏的是value,而不是key(ThreadLocal对象本身)

要搞明白一件事情,在Java中一个对象在什么情况下不会被GC掉?根据可达性分析法,如果一个对象存在一个GCRoot对它的引用链, 它就可以保证不被GC回收。

ThreadLocal的本质是每个线程维护一个ThreadLocalMap,并且ThreadLocalMap的每一个Entry都是以这个ThreadLocal对象作为Key(ThreadLocalMap上对这个ThreadLocal对象的引用是弱引用),但是这个Entry上对Value的引用为强引用。

在new一个ThreadLocal对象后(记为tl),这时候这个对象存在一个强引用。在调用这个对象的set或get方法后,又会额外的增加一个ThreadLocalMap对它的弱引用**(WeakReference)。一个对象如果同时存在强引用和弱引用的情况下,是以强引用为主导,即不会被GC回收掉。如果某一时刻tl这个对象为空,也就是JVM堆上的对象失去了强引用,在下一次GC时,这个ThreadLocal对象就会被GC掉。但是由于Value是强引用的,则始终存在着Thread Ref → Thread → ThreadLocalMap→Entry→value的这样一条强引用链(逻辑上不可达,但物理上可达),导致这个value对象既无法被访问,又无法被回收,从而导致内存泄漏。也就是说将ThreadLocal作为弱引用其实是在一定程度上缓解了内存泄漏的问题。

如何避免?

在使用完ThreadLocal时,一定要记得使用Remove()方法,避免造成内存泄漏。

全部评论
后面几句我能不能理解为key不会立刻被gc所以这段时间内value是泄露的,但因为key是弱引用所以很快会被gc,一定程度上缓解了泄露问题
2 回复 分享
发布于 2024-11-07 23:28 美国
这玩意能不能在线程池使用?
1 回复 分享
发布于 2024-11-07 15:26 上海
很详细,感谢
1 回复 分享
发布于 2024-11-07 23:37 江苏
所以你能回答key少线程少,value小为什么也会出现内存泄露?
点赞 回复 分享
发布于 2024-11-07 23:46 北京
那么为什么要这么设计呢,为什么要一个弱一个强引用,而不是都是强或都是弱
点赞 回复 分享
发布于 2024-11-08 14:50 福建
那为什么要把他设置成弱引用呀
点赞 回复 分享
发布于 2024-11-19 09:04 北京
芜湖 老学长 这是我在牛客看到的第一个校友😂
点赞 回复 分享
发布于 2024-12-05 21:53 湖北

相关推荐

双飞二本嵌入式求拷打我是在 BOSS 上投递的简历,好多都没人回复,这是开场白和简历求大神帮忙看看。您好!我是2025届应届生,最快可在一周内上岗,能够实习六个月以上,并接受加班。以下是我的核心优势和相关经验:1. 嵌入式开发能力:   熟练掌握STM32系列单片机及其外设(如GPIO、定时器、ADC、DAC、I2C、SPI、UART等),能够独立完成硬件驱动开发和调试。  熟悉FreeRTOS实时操作系统,具备多任务调度和资源管理经验。  熟悉LVGL图形库开发,能够实现嵌入式设备的图形界面设计。2. 硬件设计能力:   具备PCB设计经验,曾为2023年工创赛物流搬运赛道设计小车主板,带领团队获得国家级银奖。   熟悉硬件原理图分析,能够快速理解并调试硬件电路。3. 机器人开发与竞赛经验:   在全国大学生智能车竞赛、ROS机器人竞赛中多次获得国家级奖项,具备丰富的机器人开发经验。   熟悉Linux环境,对ROS和ROS 2有一定了解,能够进行机器人系统的开发与调试。4. 编程能力:   熟悉C/C++,熟悉Python,能够高效完成嵌入式开发和算法实现。   具备良好的代码规范和文档编写能力。5. 团队协作与领导能力:   在多个项目中担任核心开发或团队负责人,具备良好的沟通能力和团队协作精神。   在工创赛中带领团队完成项目规划、任务分配和技术攻关,展现了较强的领导力。我对嵌入式开发、机器人技术和智能硬件充满热情,期待加入贵公司,与团队共同成长,为公司创造价值!如果有合适的岗位,欢迎随时联系我,期待进一步沟通!
沉淀一会:嵌入式就是狗屎
点赞 评论 收藏
分享
新记话事人:你就和她说去抖音了
点赞 评论 收藏
分享
评论
13
47
分享

创作者周榜

更多
牛客网
牛客企业服务