ThreadLocal的弱引用

【Java】强软弱虚四种引用,弱引用在ThreadLocal中的应用 Java中的引用类型 - 强软虚弱 强引用 Object strongReference = new Object(); 强引用就是普通的引用 只要有引用指向它,就不会被回收。就算内存满了也不会回收, 软引用 内存空间不够时,弱引用会被回收 设置堆内存最大20M 插入15M的强引用之后,堆空间不足了,软引用被干掉了。 软引用有什么作用?用于缓存。缓存可以做成软引用:内存不够的时候,踢... 阅读详情

ThreadLocal中,获取到线程私有对象是通过线程持有的一个threadLocalMap,然后传入ThreadLocal当做key获取到对象的,这时候就有个问题,如果你在使用完ThreadLocal之后,将其置为null,这时候这个对象并不能被回收,因为他还有 ThreadLocalMap->entry->key的引用,直到该线程被销毁,但是这个线程很可能会被放到线程池中不会被销毁,这就产生了内存泄露,jdk是通过弱引用来解决的这个问题的,entry中对key的引用是弱引用,当你取消了ThreadLocal的强引用之后,他就只剩下一个弱引用了,所以也会被回收。

看代码 threadLocal是一个强引用,引用了堆中ThreadLocal对象A,然后调用set方法时,在当前线程的threadLocalMap中也引用了对象A,即entry中的key,如果entry中的key不设为弱引用的话,就会存在上面说的对象A内存泄露的问题。

ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
threadLocal.set(1);
threadLocal.get();
threadLocal = null;



作者:吕清海
链接:https://www.zhihu.com/question/37401125/answer/337717256
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

ThreadLocal在解决完Entry中的key内存泄露问题后,还有一个内存泄露问题,就是Entry中的value

因为只有key是弱引用,当上面threadLocal强引用变空时,entry.key也会被回收,这个时候还剩下Entry和Entry中的value。

因为entry是跟threadLocalMap绑定在一起的,threadLocalMap又是跟Thread绑定在一起的。所以只要线程没销毁的话,这个entry就不会被销毁,这样就内存泄露了。

ThreadLocal提供了这个问题的解决方案。

每次操作set、get、remove操作时,ThreadLocal都会将key为null的Entry删除,从而避免内存泄漏。

那么问题又来了,如果一个线程运行周期较长,而且将一个大对象放入LocalThreadMap后便不再调用set、get、remove方法,此时该仍然可能会导致内存泄漏。

这个问题确实存在,没办法通过ThreadLocal解决,而是需要程序员在完成ThreadLocal的使用后要养成手动调用remove的习惯,从而避免内存泄漏。

什么是ThreadLocal,一篇文章彻底搞懂Java多线程中的ThreadLocal【保姆级教程】 多线程、Thread、java 阅读详情

相关推荐

ThreadLocal 弱引用设计:内存泄漏防护与性能权衡

本文深入剖析了ThreadLocal弱引用设计的内存泄漏防护机制与性能权衡。通过分析ThreadLocalMap中Entry的弱引用Key设计,解释了其如何防止ThreadLocal对象本身泄漏,但无法完全避免Value对象的内存泄漏。文章结合线上故障案例,探讨了惰性清理机制带来的性能影响,并给出了使用后必须remove()、声明为static final等最佳实践,帮助开发者在内存安全与性能之间找到平衡。

weixin_29290379的博客 395

Threadlocal中的弱引用到底是怎么一回事

最近在复习面试资料的时候,偶然间看到了有人觉得Threadlocal的一个缺点是内存泄漏,顺着他的博客往下看,他就是觉得在entry中的key存在着对threadlocal实例对象的弱引用,然后就觉得在一次gc以后会因为key为null但是value还有值从而造成内存泄漏。 我左思右想,还是觉得不对劲,再查看相关文献和源码的时候才恍然大悟——人家早就是有预谋的使用弱引用好吗。。。可是说到这里有人会说这个人到底在讲什么??那么现在我们理顺思路重新讲呗 什么是Threadlo...

m0_59602613的博客 7046

DETRs with Collaborative Hybrid Assignments Training论文阅读与代码

在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习,反之亦然,也会影响解码器中的注意力学习。为了缓解这个问题,作者提出了一种新颖的协同混合分配训练方案,名为Co-DETR,以从多样的标签分配方式中学习更高效、更有效的基于DETR的检测器。这种新的训练方案可以通过训练多个并行辅助 Head ,以一对多的标签分配方式(如ATSS和Faster RCNN)进行监督,轻松增强端到端检测器中编码器的学习能力。

qingjing0413的博客 1154

ThreadLocal总结和弱引用

文章目录一、简介1.ThreadLocal简介2.基本用法二、原理1.set方法2.get方法三、常见问题1.ThreadLocal会不会内存泄漏四、ThreadLocal使用建议五、拓展1.弱引用(1)定义(2)用法(3)ThreadLocal中的弱引用 一、简介 1.ThreadLocal简介 ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。

ouyujiajisen的博客 1274

别再手动改文献了!手把手教你定制Mendeley的GB/T 7714-2005引用格式(附常见问题修复)

本文详细指导如何定制Mendeley的GB/T 7714-2005引用格式,解决科研文献管理中的常见问题。通过深度解析Mendeley样式编辑器,精准控制作者显示规则、出版社信息精简及期刊页码处理,实现参考文献一键合规。附常见问题修复和实战调试方法,大幅提升学术写作效率。

weixin_26833503的博客 374

MatLab:数字图像处理实验

图像处理基本处理实验目的实验环境实验内容题目一代码结果题目二平移平移代码平移结果水平镜像水平镜像代码水平镜像结果垂直镜像垂直镜像代码垂直镜像结果放大放大代码放大结果缩小缩小代码缩小结果旋转旋转代码旋转结果双线性旋转旋转代码旋转结果 实验目的 1、熟悉并掌握MATLAB工具的使用;  2、实现图像的读取、显示、存储、平移、镜像、放大、缩小及旋转操作; 3、掌握常用的插值方法,并了解其优缺点。 实验环境 MatLab2016 实验内容 题目一 读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分别显

luoyao_的博客 9694

【JVM】为什么ThreadLocal被设计为弱引用

为什么ThreadLocal被设计为弱引用

weixin_46956020的博客 2402

Graylog日志系统实战:高效接收与解析交换机日志

本文提供Graylog日志系统的实战部署与配置指南,重点讲解如何高效接收与解析交换机日志。通过Docker快速部署,配置Syslog输入,并指导华为、华三等主流交换机将日志发送至Graylog。文章还介绍了使用提取器解析日志字段、创建数据流进行分类,以及设置报警规则,实现从被动排查到主动预警的运维转变,帮助网络工程师构建集中、智能的日志管理系统。

weixin_29284885的博客 540

Java ThreadLocal为什么要用弱引用

引用类型方案对 Key 的影响对 Value 的影响优点缺点全强引用无法回收,泄漏无法回收,泄漏无造成Key和Value双双泄漏Key弱引用, Value强引用可回收依赖主动清理,否则泄漏解决了Key的泄漏问题Value仍有泄漏风险(需主动清理)Key强引用, Value软引用无法回收,泄漏内存不足时回收可能避免OOMKey泄漏;

weixin_43680337的博客 1227

一文告诉你:如何在trae中编译运行STM32程序,并让AI帮你修改代码

本文详细介绍了如何将STM32程序从Keil迁移到国产免费工具Trae,并利用AI进行代码修改的全过程。

水滴爬呀爬 4883

程序化广告ADX系统架构设计与实现

摘要: 本文详细介绍了程序化广告交易平台(ADX)的系统架构设计与实现。ADX作为连接广告主与媒体的核心平台,采用基于腾讯云和阿里云的微服务架构,包含网络基础设施、负载均衡、消息处理、核心业务服务和多级数据存储等层次。重点解析了Kafka消息队列处理高并发广告请求、Redis实时统计关键指标等核心技术实现,并提供了Java代码示例展示广告请求处理、竞价流程等核心功能。该系统通过分层设计和分布式组件,实现了高性能、高可用的程序化广告交易能力。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 767

ThreadLocal与弱引用

因为每一次循环threadLocal的生命周期都会结束,根据可达性分析算法,当触发GC时,在过去循环产生的ThreadLcoal都将会被垃圾回收,有人可能会说了,ThreadLocalMap中不是还存在引用吗,巧了,看了ThreadLocal的基本API,可能会想当然的以为拷贝的数据就是存在ThreadLocal,那可就大错特错啦。随便百度,就能够得到大概的答案,threadLocal主要用于解决线程并发问题,将共享变量拷贝到一份到自己的线程,来避免并发修改以及竞态问题。那为什么弱引用可以防止泄露呢?

weixin_59232619的博客 1112

详解大模型微调数据集构建方法(持续更新)

本文详细介绍了大模型微调数据集构建方法,希望能对学习大模型的同学们有所帮助。 文章目录 1. 前言 2. 微调数据集构建方法 2.1 方法一 2.2 方法二 2.3 方法三 2.4 方法四 2.5 方法五

herosunly的博客 28万+

【JVM篇】ThreadLocal中为什么要使用弱引用

在技术的道路上,我们不断探索、不断前行,不断面对挑战、不断突破自我。科技的发展改变着世界,而我们作为技术人员,也在这个过程中书写着自己的篇章。让我们携手并进,共同努力,开创美好的未来!愿我们在科技的征途上不断奋进,创造出更加美好、更加智能的明天!

小吉妙妙屋 3431

【26美赛F题 To Gen-AI, or Not To Gen-AI】(MCM/ICM)思路解析及代码分享

摘要:本文研究生成式人工智能(Gen-AI)对三类职业(STEM、技能型工艺、艺术)的影响,建立量化模型预测未来10-20年岗位需求变化。通过分析AI替代效应($R_{sub}(t)$)和增强效应($R_{enh}(t)$),提出差异化高校课程调整策略:STEM专业需加强AI集成能力,技能型工艺专业应结合智能工具与实操训练,艺术专业需平衡AI创作辅助与原创性培养。模型表明,高校通过针对性课程优化可提升毕业生在AI时代的就业竞争力,为教育决策提供数据支持。(149字)

一键难忘的博客 636

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

ThreadLocal弱引用和内存泄漏详解

综上所述,并不是弱引用导致了内存泄漏,而是我们没有移除数据导致的,相反这里使用弱引用反而帮我们降低了内存泄漏的风险,因为GC会清理掉已经没有被强引用的弱引用,所以在我们使用ThreadLocal,get和set等操作的时候触发了ThreadLocalMap的清理机制(清理掉失效的ThreadLocal的数据),从而降低内存泄漏的风险。从上面可以看出,remove方法会清理掉我们的ThreadLocal设置的数据,并且还帮我们清理掉,已经被GC干掉了的ThreadLocal保存的数据。

jjrenwu003的博客 890

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

ThreadLocal 为什么要引入弱引用?

但同时也带来了一些问题。这样设计的主要目的是。

qq_36929638的博客 1652

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

ThreadLocal的弱引用之谜:为什么Java要这样设计?

强引用(Strong Reference):普通的对象引用,只要存在就不会被GC回收2.软引用(Soft Reference):内存不足时会被GC回收3.弱引用(Weak Reference):只要GC就会回收4.虚引用(Phantom Reference):几乎等同于没有引用// 强引用// 弱引用防止ThreadLocal对象本身的内存泄漏当外部强引用消失时,允许GC回收key虽然value可能暂时泄漏,但比key和value都泄漏要好弱引用不是银弹。

全栈开发工程师 1145

ThreadLocal为什么要使用弱引用和内存泄露问题

在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用. 下面来看两个问题: 1为什么要使用弱引用 2为什么会出现内存泄露问题 为什么要使用弱引用 每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对...

qq_42862882的博客 1万+

被面试官问懵了,ThreadLocal的key为什么设置成弱引用?

目录前言面试连环炮key为什么要设置成弱引用?value为什么不设置成弱引用 前言 想起来去年九月夜郎自大,面过一次蚂蚁金服,一面面试官上来一串ThreadLocal的连环炮直接把我干懵了……虽然现在回想起来问得都挺简单,不过还是来做一发总结,希望看到这篇文章的小伙伴以后就不要栽坑里了。 面试连环炮 先来体验一下关于ThreadLocal的连环炮: ThreadLocal是什么?项目中用到过吗? ThreadLocal的结构是怎么样的? 使用ThreadLocal需要注意哪些问题? 为

womeiyouzaihuashui的博客 1万+

Java中的ThreadLocal为什么使用弱引用

根据弱引用的特点:假设某个对象只有弱引用关联,该对象是可以被回收的!(假设Entry和ThreadLocal之间使用强引用,没人指向这个ThreadLocal对象,但它还是不能被回收,就出现内存泄漏!等于说通过Entry弱引用,既可以找到ThreadLocal对象,又可以找到存放的value值。ThreadLocalMap中的key就是Entry,Entry是一个弱引用,关联了当前ThreadLocal对象。总结一下使用弱引用的好处:如果ThreadLocal对象不再使用了(不再被引用了)。

qq_64064246的博客 871

ThreadLocal弱引用与内存泄漏分析

本文对ThreadLocal弱引用进行一些解析,以及ThreadLocal使用注意事项。 ThreadLocal 首先,简单回顾一下,ThreadLocal是一个线程本地变量,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。 其实现原理这里就不做详细阐述,其数据结构是每个线程Thread类都有个属性ThreadLocalMap,...

帅性而为1号的博客 1156

为什么 Java 中的 ThreadLocal 对 key 的引用为弱引用?

对象本身不再被外部强引用时,允许垃圾回收器(GC)回收它,从而减少内存泄漏的风险。对象不再使用时允许 GC 回收,减少内存泄漏风险。这一设计平衡了自动清理和开发者控制,是。在线程隔离中的重要优化,但也要求开发者注意 value 的清理。的使用场景和生命周期管理密切相关。弱引用的 value 未自动清理可能导致泄漏。中 key 的引用设计为弱引用(对 key 使用弱引用是为了在。的弱引用设计是其特性之一。弱引用支持隔离的内存管理。

qq_63553317的博客 1012

ThreadLocal 为什么要用弱引用?

在 Java 并发编程的世界里,我们通常谈论的是“如何安全地共享数据”(比如用或Lock但在某些时候,我们根本不想共享。我们希望每个线程都有自己独立的一份数据,互不干扰。这就是的使命。它不搞“排队”,而是搞“隔离”。它给每个线程发了一个**“私房钱存折”**。

郑龙飞 1416

内存泄露 threadlocal的内存泄露 ThreadLocal为何使用弱引用

Threadlocal的引用类型是弱引用,容易导致内存泄露,但其为何还要使用弱引用,那么,这篇文章一起带你去分析。

念兮为美 1164

threadlocal内存泄露_ThreadLocal弱引用与内存泄漏分析

对ThreadLocal弱引用进行一些解析,以及ThreadLocal使用注意事项。ThreadLocal首先,简单回顾一下,ThreadLocal是一个线程本地变量,每个线程维护自己的变量副本,多个线程互相不可见,因此多线程操作该变量不必加锁,适合不同线程使用不同变量值的场景。其实现原理这里就不做详细阐述,其数据结构是每个线程Thread类都有个属性ThreadLocalMap,用来维护该线程的...

weixin_39614877的博客 678
上一篇: (转)B+树的理解
下一篇: 解决跨域问题
AAA821
博客等级 码龄14年 19粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值