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实例。
** 实线代表强引用,虚线代表弱引用 **
- 强引用,使用最普遍的引用,一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不回收这种对象。
如果想取消强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样可以使JVM在合适的时间就会回收该对象。 - 弱引用,JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类来表示。
本文来自博客园,作者:NeverLateThanBetter,转载请注明原文链接:https://www.cnblogs.com/do-it-520/p/ThreadLocal.html
韶华易逝,不能虚度年华。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?