当前位置:网站首页>ThreadLocal内存泄漏问题讲解
ThreadLocal内存泄漏问题讲解
2022-08-04 05:35:00 【阿里巴巴首席技术官】
一、首先回顾一下内存泄漏是什么:
内存泄漏是指:程序已经不再使用某字段、某对象。但是却无法回收掉它占用的内存。
两个关键点:不再使用 并且 无法回收
二、为什么ThreadLocal会发生内存泄漏问题?
2.1 问题发现
以下是整体结构
ThreadLocal就相当于一个访问工具类,通过操作ThreadLocal对象的方法 来操作存储在当前线程内部的ThreadLocalMap里的值
ThreadLocalMap是一个哈希数组,key为ThreadLocal对象,Value为一个Object类型的值
这就意味着可以创建多个ThreadLocal来获取不同ThreadLocal往这个Map里存的值
调用ThreadLocal.get() 方法的时候,会将当前ThreadLocal对象传过去,所以可以获取到指定ThreadLocal设置到当前线程的值
问题:ThreadLocal被回收了
此时就没有方式能够访问到val了,所以val就是不会再被程序用到,但是由于Thread还存在就无法回收,那么此时便存在了内存泄漏!
对应的简单示例代码如下
可以发现问题,ThreadLocal已经被清理掉了,代表现在已经没有方式去访问当前ThreadLocal存到Map里的value数据了
但是当前线程由于还在执行、没有关闭,所以内部的value还一直存在!
此时 造成内存泄漏
2.2 ThreadLocal的防御机制
官方也认识到了这个问题,所以Map的key设置为了弱引用
所以现在会变成这个样子,当ThreadLocal被清理掉了。Key无人引用后,就会被gc清理掉,因为他是弱引用,key变为null了,代表此时value需要被清理了。这个时候调用set、get、remove方法时都会触发清理机制(监测key==null就清理value)
而如果key是强引用,就不知道是不是没人引用这个值了,就不知道要不要清理。
当然了,如果Thread线程先于ThreadLocal被回收掉,就不会有这个问题了
三、解决办法
在使用完数据后即使调用remove() 清理掉就行了
边栏推荐
- C#找系统文件夹路径
- Implementation of ICEEMDAN Decomposition Code in MATLAB
- 基于爬行动物搜索RSA优化LSTM的时间序列预测
- 狗都能看懂的变化检测网络Siam-NestedUNet讲解——解决工业检测的痛点
- Database Skills: Organize SQL Server's Very Practical Scripts
- Detailed explanation of DenseNet and Keras reproduction code
- 代码小变化带来的大不同
- QT 显示窗口到最前面(非置顶)
- 对象的扩展补充
- Gramm Angle field GAF time-series data into the image and applied to the fault diagnosis
猜你喜欢
nacos 返回 403 unknown user 太他么坑了 源码解析
解决腾讯云DescribeInstances api查询20条记录以上的问题
EfficientNet解读:神经网络的复合缩放方法(基于tf-Kersa复现代码)
bitnami/mongodb-sharded在AWS EKS扩展shard失败解决
天鹰优化的半监督拉普拉斯深度核极限学习机用于分类
益智小游戏- 算算总共多少正方形
mysql:列类型之float、double
U-Net详解:为什么它适合做医学图像分割?(基于tf-Kersa复现代码)
数据库知识:SQLServer创建非sa用户笔记
A semi-supervised Laplace skyhawk optimization depth nuclear extreme learning machine for classification
随机推荐
E-R图总结规范
IDEA 控制台 中文乱码问题(如果网上教程都无法解决你的问题的话)
如何在Excel 里倒序排列表格数据 || csv表格倒序排列数据
Implementation of ICEEMDAN Decomposition Code in MATLAB
软件稳定性思考
搭建redis哨兵
数组的一些方法
0--100的能被3整出的数的集合打乱顺序
怎样才能转行成功?
golang 的库引用方法
元素的增删克隆以及利用增删来显示数据到页面上
ES6新语法:symbol,map容器
A priori box (Anchor) in target detection
Database document generation tool V1.0
Detailed explanation of DenseNet and Keras reproduction code
sql常用函数
Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
读取JDBC配置文件
数据库实体类对应daoimpl,基础的增删改查。
Based on the EEMD + + MLR GRU helped time series prediction