当前位置:网站首页>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() 清理掉就行了
边栏推荐
- 【音视频开发系列】QT 采集麦克风PCM并播放
- 无监督特征对齐的迁移学习理论框架
- CMDB 腾讯云部分实现
- Base64编码原理
- 数据库知识:SQLServer创建非sa用户笔记
- Database: Organize Four Practical SQL Server Scripting Functions
- Memory Management
- 普通用户 远程桌面连接 服务器 Remote Desktop Service
- 水平垂直居中的12种方法,任意插入节点的方法,事件的绑定的三种方法和解绑的方法,事件对象,盒子模型
- Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same
猜你喜欢
关于gopher协议的ssrf攻击
Database: Organize Four Practical SQL Server Scripting Functions
数据库:整理四个实用的SQLServer脚本函数
Microsoft Store 微软应用商店无法连接网络,错误代码:0x80131500
bitnami/mongodb-sharded在AWS EKS扩展shard失败解决
mysql:列类型之float、double
Uos统信系统 IP地址以及完整主机名配置
Software: Recommend a domestic and very easy-to-use efficiency software uTools to everyone
sql常用函数
IoU, GIoU, DIoU and CIoU in target detection
随机推荐
字符串的一些方法
Uos统信系统 Postfix-smtps & Dovecot-imaps
unicloud 腾讯云 上传文件 Have no access right to the storage uniapp
更改软件的默认安装位置
QT QOpenGLWidget 全屏导致其他控件显示问题
基于EEMD+GRU+MLR的时间序列预测
为什么不使用VS管理QT项目
Implementation of ICEEMDAN Decomposition Code in MATLAB
Uos统信系统 CA根证书搭建
【C# - 爬虫】使用Selenium实现爬虫,获取近七天天气信息(包含完整代码)
复杂格式的json转递
软件:给大家推荐一款国产非常好用的效率软件uTools
树莓派 4 B 拨动开关控制风扇 Rasberry Pi 4 B Add Toggle Switch for the Fan
代码小变化带来的大不同
Computer software: recommend a disk space analysis tool - WizTree
目标检测中的IoU、GIoU、DIoU与CIoU
set集合
元素的增删克隆以及利用增删来显示数据到页面上
Uos统信系统 IP地址以及完整主机名配置
升级到 MediaPlayer 11 时跳过验证副本的方法