ThreadLocal内存泄漏

介绍

ThreadLocal提供了线程独有的局部变量,可以在整个线程存活的过程中随时取用,极大地方便了一些逻辑的实现。常见的ThreadLocal用法有:

  • 存储单个线程上下文信息。比如存储id等;
  • 使变量线程安全。变量既然成为了每个线程内部的局部变量,自然就不会存在并发问题了;
  • 减少参数传递。比如做一个trace工具,能够输出工程从开始到结束的整个一次处理过程中所有的信息,从而方便debug。由于需要在工程各处随时取用,可放入ThreadLocal。

比如:在做拦截的时候,被拦截的接口,如果满足要求,例如头部信息中携带token,如果获取用户信息,可以直接从TheadLocal获取,以免被拦截的接口每次都要接受参数的传递,来获取当前用户,使用ThreadLocal,需要在拦截器之前定义LOCAL.set(Object),然后在接口中LOCAL.get(),最后在拦截器后LOCAL.remove(),防止内存泄漏。

原理

在stack中存在着当前线程和threadLocal的引用,在heap中定义Currrent Thread和ThreadLocal,Current Thread中有ThreadLocalMap,在Map中的key弱引用ThreadLocal实例,每个key对应一个Value(ThreadLocal set的变量),线程中可以有多个ThreadLocal实例。
** 实线代表强引用,虚线代表弱引用 **

  1. 强引用,使用最普遍的引用,一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。
    如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。
  2. 弱引用,JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
posted @   NeverLateThanBetter  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示