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

产品经理-面试题目--持续更新

答:面试官,你好,我叫XXX,来自于XXXX,我系统的学习过软件开发,也主动的积累了不少产品方面的实战经验,在学习期间,我自己独立的完成了2个深度项目,一个是仿抖音的短视频APP全流程设计,另外一个是电商后台系统的模块,通过这些项目,我不仅熟练使用Axure等工具做出高保真原型图和清晰的产品框架,也形成了数据驱动和用户优先的思维习惯,另外,我也注重拓展自己的能力边界,拿到了CAIE人工智能证书,我希望能把AI能力融入到产品场景,提升体验和效率,我非常喜欢产品工作带来的创造性和逻辑性,希望有机会加入贵公司。

m0_63966958的博客 956

ThreadLocal总结和弱引用

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

ouyujiajisen的博客 1274

MicroPython 开发ESP32应用教程 之 WIFI配网 Web页面配网 softAP 配网 web页面控制WS2812灯珠

MicroPython 开发ESP32应用教程 之 WIFI配网 Web页面配网 softAP 配网 web页面控制WS2812灯珠

weald2000的专栏 2080

Python XML 转 JSON,XML 转字典

今天我们将学习如何在 Python 中将 XML 转换为 JSON 和 XML 转换为字典。我们可以使用 Python 的xmltodict模块来读取 XML 文件并将其转换为字典或 JSON 数据。我们还可以在大型 XML 文件上进行流式处理,并将其转换为字典。在进入编码部分之前,让我们首先了解为什么需要进行 XML 转换。

rubys_的专栏 2501

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

为什么ThreadLocal被设计为弱引用

weixin_46956020的博客 2402

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

Java ThreadLocal为什么要用弱引用

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

weixin_43680337的博客 1227

YOLO11 改进 - C2PSA | C2PSA融合HEWL(高频增强小波层):小波逆变换+双通道注意力增强+高频显式增强 | TGRS 2026

本文介绍了高频增强小波层(HEWL),一种专为解决红外小目标检测中边缘退化与语义模糊问题设计的上采样模块。该方法结合小波逆变换与交替通道注意力(ALCA),通过显式增强高频细节并优化特征融合,实现精准的边缘重建与语义对齐。我们将 HEWL 融入 PSABlock 结构构建了 C2PSA_HEWL 模块,并成功集成进 YOLO11 的骨干网络,替代原有的 C2PSA 模块。实验证明,结合 HEWL 的 YOLO11 在检测任务中表现优异,有效提升了模型对细节特征的捕捉能力。

魔改工程师的博客 102

Superpowers与 OpenSpec、Spec Kit 对比

按照官方仓库定义,Superpowers 是一套构建在 composable skills 之上的完整软件开发工作流。它不是单纯的 prompt 集合,而是把一系列工程动作做成默认流程。一个需要明确的点:Superpowers 并不只偏 Claude Code,根据。

人不风流枉少年 1813

ThreadLocal与弱引用

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

weixin_59232619的博客 1112

【Unity实战篇】| 游戏轮播图效果,多种实现思路及完整教程

在众多游戏的主界面、商城、图鉴或关卡选择界面中,我们常常能看到轮播图的身影。 它以动态、直观的方式展示游戏角色、皮肤、成就或场景,不仅极大地提升了界面的美观度和交互性,还能高效地引导玩家聚焦于核心内容。 本篇文章将从零开始,一步步在Unity中构建一个功能完备、性能优良的游戏轮播图。 使用UGUI系统,通过代码驱动,实现包括自动轮播、手动拖拽、分页指示器、无限循环等核心功能。 无论是UI新手还是希望优化现有方案的开发者,这篇文章都将为你提供清晰的思路和完整的解决方案。

努力前行,总会成为自己心中的那道光 4万+

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

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

小吉妙妙屋 3431

Python爬虫实战:使用Scrapy+Playwright高效爬取全球石油价格历史数据

python复制下载# 产品信息# 日期信息# 价格数据price = scrapy.Field() # 收盘价open = scrapy.Field() # 开盘价high = scrapy.Field() # 最高价low = scrapy.Field() # 最低价volume = scrapy.Field() # 交易量change_percent = scrapy.Field() # 涨跌幅# 元数据。

2201_76125261的博客 1020

Devexpress16.2.6破解工具

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

ThreadLocal弱引用和内存泄漏详解

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

jjrenwu003的博客 890

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

ThreadLocal 为什么要引入弱引用?

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

qq_36929638的博客 1652

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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、付费专栏及课程。

余额充值