ThreadLocal内存泄漏的真实原因分析

戚薇 Java教程 发布时间:2023-06-26 14:22:19 阅读数:5519 1
下文笔者讲述ThreadLocal内存泄漏的原因分析,如下所示

ThreadLocal的简介

ThreadLocal功能:
   提供线程内的局部变量
    这种变量在线程的生命周期内起作用
	 减少同一个线程内多个函数或组件之间一些公共变量的传递的复杂度
注意谨慎使用ThreadLocal,滥用ThreadLocal会导致内存泄漏

ThreadLocal的原理图

ThreadLocal原理图
每个Thread中
  都维护一个ThreadLocalMap映射表
     这个映射表中的key是ThreadLocal实例本身
	    value是需要存储的Object

ThreadLocal内存泄漏原理分析

由于ThreadLocalMap使用ThreadLocal中的弱引用作为key
   当一个ThreadLocal没有外部强引用来引用它
      则系统GC时,ThreadLocal会被回收
      此时ThreadLocalMap中就会出现key为null的Entry
       这是key为null,但是Entry的value不为空
   如果当前线程未结束,则会出现
      key为null的Entry的value强引用链
    Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永远无法回收,造成内存泄漏

ThreadLocalMap中key使用弱引用的原理

key 使用强引用:
    引用的ThreadLocal的对象被回收
	但是ThreadLocalMap还持有ThreadLocal的强引用
       如果没有手动删除,ThreadLocal不会被回收,导致Entry内存泄漏。

key 使用弱引用:
    引用的ThreadLocal的对象被回收
	 由于ThreadLocalMap持有ThreadLocal的弱引用
      即使没有手动删除
     ThreadLocal也会被回收
     value在下一次ThreadLocalMap调用set,get,remove的时候会被清除
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202306/6899.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者