网易首页 > 网易号 > 正文 申请入驻

ThreadLocal 搭配线程池使用造成内存泄漏的原因和解决方案

0
分享至

ThreadLocal是什么

ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不通的变量值完成操作的场景。

下图为ThreadLocal的内部结构图

从上面的结构图,我们已经窥见ThreadLocal的核心机制:

  • 每个Thread线程内部都有一个Map。

  • Map里面存储线程本地对象(key)和线程的变量副本(value)

  • 但是,Thread内部的Map是由ThreadLocal维护的,由ThreadLocal负责向map获取和设置线程的变量值。

  • 更多面试资料,公众号Java精选,回复java面试,获取面试资料,支持在线刷题。

所以对于不同的线程,每次获取副本值时,别的线程并不能获取到当前线程的副本值,形成了副本的隔离,互不干扰。

ThreadLocalMap

ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用独立的方式实现了Map的功能,其内部的Entry也独立实现。

和HashMap的最大的不同在于,ThreadLocalMap结构非常简单,没有next引用,也就是说ThreadLocalMap中解决Hash冲突的方式并非链表的方式,而是采用线性探测的方式。(ThreadLocalMap如何解决冲突?

在ThreadLocalMap中,也是用Entry来保存K-V结构数据的。但是Entry中key只能是ThreadLocal对象,这点被Entry的构造方法已经限定死了。

static class Entry extends WeakReference {
/** The value associated with this ThreadLocal. */
Object value;

Entry(ThreadLocal k, Object v) {
super(k);
value = v;
}
}

Entry继承自WeakReference(弱引用,生命周期只能存活到下次GC前),但只有Key是弱引用类型的,Value并非弱引用。(问题马上就来了)

由于ThreadLocalMap的key是弱引用,而Value是强引用。这就导致了一个问题,ThreadLocal在没有外部对象强引用时,发生GC时弱引用Key会被回收,而Value不会回收。

当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMap的键值对,造成内存泄露。(ThreadLocal被回收,ThreadLocal关联的线程共享变量还存在)。

如何避免泄漏

为了防止此类情况的出现,我们有两种手段。

1、使用完线程共享变量后,显示调用ThreadLocalMap.remove方法清除线程共享变量;

既然Key是弱引用,那么我们要做的事,就是在调用ThreadLocal的get()set()方法时完成后再调用remove方法,将Entry节点和Map的引用关系移除,这样整个Entry对象在GC Roots分析后就变成不可达了,下次GC的时候就可以被回收。

2、JDK建议ThreadLocal定义为private static,这样ThreadLocal的弱引用问题则不存在了。

文章参考

  • www.jianshu.com/p/98b68c97df9b

  • www.cnblogs.com/coshaho/p/5127135.html

作者:Ethan_199402 https://blog.csdn.net/Ethan_199402/article/details/105553397

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
杰伦-布朗:我们要将比赛当成生命的依赖一样去战斗

杰伦-布朗:我们要将比赛当成生命的依赖一样去战斗

直播吧
2024-06-17 02:05:06
枪手超市开业!低价甩卖4大球星 收入有望破亿

枪手超市开业!低价甩卖4大球星 收入有望破亿

球事百科吖
2024-06-15 20:42:16
杨丞琳被路人偶遇,身高一米6在人群中年轻又精致,太羡慕李荣浩

杨丞琳被路人偶遇,身高一米6在人群中年轻又精致,太羡慕李荣浩

顶牌故事会
2024-06-12 10:03:57
女生的那层膜,到底什么样?(高清图认识一下)

女生的那层膜,到底什么样?(高清图认识一下)

水白头
2024-06-17 00:35:02
中国给孟加拉国修了座桥,结果因修的太好了!惹得对方四处显摆

中国给孟加拉国修了座桥,结果因修的太好了!惹得对方四处显摆

简读视觉
2024-06-17 01:02:45
iPad Pro瘦身大获成功之后 苹果计划推出最薄iPhone 17和MacBook Pro设计

iPad Pro瘦身大获成功之后 苹果计划推出最薄iPhone 17和MacBook Pro设计

cnBeta.COM
2024-06-17 01:22:05
中国经济巨大成就的背后:有两个痛点,是什么痛点?

中国经济巨大成就的背后:有两个痛点,是什么痛点?

永不出场的戈多
2024-06-15 07:58:52
以色列将双面开战?和黎巴嫩真主党冲突升级,边境小村遭以袭击188次,800人逃离

以色列将双面开战?和黎巴嫩真主党冲突升级,边境小村遭以袭击188次,800人逃离

红星新闻
2024-06-16 18:33:09
疯传!女员工表白大20岁副行长,言语肉麻发错群,银行回应来了

疯传!女员工表白大20岁副行长,言语肉麻发错群,银行回应来了

懂瓜瓜
2024-06-15 20:12:37
俄媒:若没收俄资产,G7国家将损失约830亿美元

俄媒:若没收俄资产,G7国家将损失约830亿美元

参考消息
2024-06-16 09:57:08
17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

17岁中专女生数学竞赛全球12名!我试着做了这套题,给跪了...

毕导
2024-06-14 17:15:49
吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

吕迪格回应定妆照争议手势:很多球员摆出这个姿势,没有宗教意涵

直播吧
2024-06-16 06:45:07
他是原中央政治局常委,连任三大省委书记,1969年被秘密处决

他是原中央政治局常委,连任三大省委书记,1969年被秘密处决

历史1949
2024-05-28 00:38:22
法国股市崩了,市值一周蒸发超万亿元!马克龙:正处于非常严峻时刻!财长:法国恐脱欧、陷金融危机

法国股市崩了,市值一周蒸发超万亿元!马克龙:正处于非常严峻时刻!财长:法国恐脱欧、陷金融危机

每日经济新闻
2024-06-16 10:12:06
这要是范佩西在荷兰半场14射靠折射进球,两大前锋屡失良机

这要是范佩西在荷兰半场14射靠折射进球,两大前锋屡失良机

直播吧
2024-06-16 22:00:34
皮耶罗与德国主持人开玩笑:我为自己在06年的进球感到抱歉

皮耶罗与德国主持人开玩笑:我为自己在06年的进球感到抱歉

懂球帝
2024-06-16 10:08:13
台媒爆料称,大S疑似在幕后操纵!让汪小菲与孩子共度父亲节

台媒爆料称,大S疑似在幕后操纵!让汪小菲与孩子共度父亲节

综艺拼盘汇
2024-06-16 23:56:04
当穷人有钱后能挥霍到什么程度?网友:我朋友天天洗脚 腰都快废了

当穷人有钱后能挥霍到什么程度?网友:我朋友天天洗脚 腰都快废了

开玩笑的水母
2024-06-14 11:18:21
17岁姜萍爆火后有人质疑作弊,网友:达摩院到校出题核实后公布的

17岁姜萍爆火后有人质疑作弊,网友:达摩院到校出题核实后公布的

一口娱乐
2024-06-16 22:07:35
瑞士和会第一天,泽连斯基吹嘘会议成就,与会各国政要却反响平平

瑞士和会第一天,泽连斯基吹嘘会议成就,与会各国政要却反响平平

叮当当科技
2024-06-16 23:44:42
2024-06-17 02:34:44
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

头条要闻

南方医院回应教师因救人迟到:教学差错是最轻档处理

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

本地
时尚
游戏
教育
公开课

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

伊姐周日热推:电影《沙漏》;动漫《眷思量2》......

梦幻西游玩家炸出160愤怒水清腰带,西栅为服战连夜换“网吧”?

教育要闻

大家都知道,这题目不会特别容易,看来还得是稳打稳的刷题才行啊

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版