当前位置: 首页 > news >正文

为什么使用ThreadLocal后要调用remove()方法呢?

ThreadLocalMap中包含一个数组,每个节点对应的类名叫Entry,这个类继承WeakReference<ThreadLocal<?>>,entry中有两个属性:key和value。特别需要指出的是key来自于父类中的threadLocal对象。

为了避免内存泄露,使用玩ThreadLocal后,一定要调用它的remove()方法,这样才能保证用完这块entry所占用的内存后,尽早的释放掉内存,最大限度的提高内存的利用率。

虽然ThreadLocal的set()、get()方法也可能会扫描并释放掉这块内存,或者需要很长时间才能释放掉,说不定在这段时间内,内存已经不够用了,出现OOM错误了,所以这种方式是不可靠的。因为使用这种方式的前提条件是GC清理的比较及时、执行set()、get()方法时恰巧能发现这个过期的entry,这样才能保证过期entry对象被及时清理。

清理时,ThreadLocalMap中包含一个名字类似叫cleanup方法,只需要调用这个方法就可以啦。方法里面的操作就是将

entry.value = null; 
entry = null;

这样的话,就不会再引用对应的对象了。下一轮GC来临时,就会把这俩对象清理掉啦,美滋滋。

http://www.dtcms.com/a/161228.html

相关文章:

  • Springboot整合阿里云腾讯云发送短信验证码 可随时切换短信运营商
  • 数智双翼,生态共赢:中钧科技“双帮”如何领航企业全域升级?
  • 【java】接口
  • OpenResty深度解析:从卓伊凡的”隐形主流”论看其深度原理与应用生态-卓伊凡
  • Label Studio 软件介绍及安装使用说明
  • QGIS+mcp的安装和使用
  • 【零基础入门】ASP.NET Core快速搭建第一个Web应用
  • Shiro学习(七):总结Shiro 与Redis 整合过程中的2个问题及解决方案
  • Kotlin DSL 深度解析:从 Groovy 迁移的困惑与突破
  • 加密算法:ed25519和RSA
  • 如何搭建spark yarn 模式的集群集群。
  • 快速搭建对象存储服务 - Minio,并解决临时地址暴露ip、短链接请求改变浏览器地址等问题
  • Matlab自学笔记五十二:变量名称:检查变量名称是否存在或是否与关键字冲突
  • 如何创建并使用极狐GitLab 受保护分支?
  • 第二十节:编码实操题-实现图片懒加载指令
  • Milvus(9):字符串字段、数字字段
  • Linux查看文件列表并按修改时间降序排序
  • Sql刷题日志(day6)
  • QTableView复选框居中
  • K8S学习笔记01
  • uniapp+vue3+ts 使用canvas实现安卓端、ios端及微信小程序端二维码生成及下载
  • 线性代数的本质大白话理解
  • 分布式链路追踪理论
  • [ACTF2020 新生赛]Include [ACTF2020 新生赛]Exec
  • Ubuntu深度学习革命:NVIDIA-Docker终极指南与创新实践
  • python练习:求数字的阶乘
  • Ubuntu 20.04 上安装 最新版CMake 3.31.7 的详细步骤
  • Spring Boot定时任务
  • Sui 主网升级至 V1.47.1
  • Spring Boot 3与JDK 8环境下的单元测试实践指南