在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用.

下面来看两个问题:

1为什么要使用弱引用

2为什么会出现内存泄露问题


- 为什么要使用弱引用 -

每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap.

Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key.

每个key都弱引用指向threadlocal.

所以当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal就可以顺利被gc回收

注意!假如每个key都强引用指向threadlocal,也就是上图虚线那里是个强引用,那么这个threadlocal就会因为和entry存在强引用无法被回收!造成内存泄漏 ,除非线程结束,线程被回收了,map也跟着回收。

- 依然出现的内存泄露问题 -

虽然上述的弱引用解决了key,也就是线程的ThreadLocal能及时被回收,但是value却依然存在内存泄漏的问题。

当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收.

map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露,

因为存在一条从current thread连接过来的强引用.

只有当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收.

- 结论 -

所以当线程的某个localThread使用完了,马上调用threadlocal的remove方法,那就啥事没有了!

另外其实只要这个线程对象及时被gc回收,这个内存泄露问题影响不大,但在threadLocal设为null到线程结束中间这段时间不会被回收的,就发生了我们认为的内存泄露。
  
最要命的是线程对象不被回收的情况,这就发生了真正意义上的内存泄露。
比如使用线程池的时候,线程结束是不会销毁的,会再次使用的。就可能出现内存泄露。

- 补充说明 -

Java为了最小化减少内存泄露的可能性和影响,在ThreadLocal的get,set的时候都会清除线程Map里所有key为null的value。

所以最怕的情况就是:
threadLocal对象设null了,开始发生“内存泄露”,然后使用线程池,这个线程结束,线程放回线程池中不销毁,这个线程一直不被使用,或者分配使用了又不再调用get,set方法,那么这个期间就会发生真正的内存泄露。

ThreadLocal为什么要使用弱引用和内存泄露问题相关推荐

  1. ThreadLocal中的3个大坑,内存泄露都是小儿科!

    我在参加Code Review的时候不止一次听到有同学说:我写的这个上下文工具没问题,在线上跑了好久了.其实这种想法是有问题的,ThreadLocal写错难,但是用错就很容易,本文将会详细总结Thre ...

  2. Java 理论与实践: 用弱引用堵住内存泄漏---转载

    要让垃圾收集(GC)回收程序不再使用的对象,对象的逻辑 生命周期(应用程序使用它的时间)和对该对象拥有的引用的实际 生命周期必须是相同的.在大多数时候,好的软件工程技术保证这是自动实现的,不用我们对对 ...

  3. 分析Threadlocal内部实现原理,并解决Threadlocal的ThreadLocalMap的hash冲突与内存泄露

    前言 ThreadLocal 的经典使用场景是数据库连接. session 管理.多线程等-- 比如在Spring中,发挥着巨大的作用,在管理Request作用域中的Bean.事务管理.任务调度.AO ...

  4. sqlserver2008未将对象引用设置到对象的实例_面试官:ThreadLocal 的内存泄漏是弱引用导致的,你确定?...

    面试官:ThreadLocal 了解吗? Python 小星:线程局部变量,多线程下能保证各个线程的变量相对独立于其他线程的变量. 面试官:那你说下它是如何保证线程隔离的? Python 小星:每个线 ...

  5. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  6. .NET中常见的内存泄露问题——GC、委托事件和弱引用

    其实吧,内存泄露一直是个令人头疼的问题,在带有GC的语言中这个情况得到了很大的好转,但是仍然可能会有问题. 一.什么是内存泄露(memory leak)? 内存泄露不是指内存坏了,也不是指内存没插稳漏 ...

  7. 阿里面试: 说说强引用、软引用、弱引用、虚引用吧

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们都知道 JVM 垃圾回收中,GC判断堆中的对象实例或数 ...

  8. threadlocal内存泄露_ThreadLocal原理解析

    谈一谈不常见却又不可少的ThreadLocal 在写ThreadLocal之前,需要先巩固下一点相关知识:Java内存模型及共享变量的可见性. 内存模型中所有变量存储在主内存中,当一个线程中要使用某个 ...

  9. ThreadLocal是否会引发内存泄露的分析 good

    这篇文章,主要解决一下疑惑: 1. ThreadLocal.ThreadLocalMap中提到的弱引用,弱引用究竟会不会被回收? 2. 弱引用什么情况下回收? 3. JAVA的ThreadLocal和 ...

最新文章

  1. 北航成AAAI 2021最大赢家,两篇一作斩获最佳论文、提名奖,研究皆与Transformer相关...
  2. 华为SDSec分为几层
  3. SICStus Prolog 3.10.0正式版下载
  4. 支持本地 持久化的 单机版 consul 服务
  5. RStudio修改快捷键确保每次运行都是从头运行所有代码
  6. vba 提取 json某个值_Excel中提取不重复值的方法汇总(5种基础+VBA+1个自定义函数)...
  7. ICCV 2021 第二届无人车视觉(AVVision)研讨会征稿
  8. qemu-img创建qcow2虚拟磁盘的预分配策略
  9. c++双向列表释放_至为芯科技IP5356集成20W输出和双路TYPE-C快充输出,适用于充电宝/移动电源方案...
  10. centos 7 菜鸟第一天 找回win10
  11. java抓取动态生成的网页
  12. matplotlib 操作子图(subplot,axes)
  13. tensorflow构建CNN模型时的常用接口函数
  14. 精品软件 推荐 TM2013 性能不好的电脑可以用这软件替代QQ
  15. spring session过期时间设置
  16. 基于mysql学生成绩管理论文_基于SQL Server的学生成绩管理系统设计论文
  17. 简历制作器App使用条款
  18. 笔记本电脑里的微信文件数据误删了 如何恢复?
  19. 旅行商问题(Traveling Salesman Problem,TSP)的+Leapms线性规划模型及c++调用
  20. 程序员群嘲红芯浏览器:注释过度很业余,创新混淆视听

热门文章

  1. 如何在 bash 中使用索引数组
  2. 一起聊聊好玩的Openresty
  3. 能详细地讲讲stm32该怎么学吗?
  4. linux 支持7代cpu型号,win7最高支持几代cpu
  5. 线段树 ---- 2021牛客多校第一场 J Journey among Railway Stations [线段树维护区间可行性判断]
  6. 解题报告:luogu P2272 [ZJOI2007]最大半连通子图(tarjan缩点、递推DP、hash、set判重)
  7. 9.67最不下降子序列
  8. 2万人同时访问 nodejs_Nodejs 与 Python 的使用对比
  9. html背景mov,科技常识:html5自动播放mov格式视频的实例代码
  10. 计算机网络与通信pdf谢希仁_考研刷题资料谢希仁《计算机网络》(第7版)配套题库【考研真题精选(部分视频讲解)+章节题库】...