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

Java ThreadLocal内存泄漏分析

原理参考: ThreadLocal原理以及用法详解-CSDN博客
ThreadLocal使用完都建议调用remove()清除上下文,特别是在线程池的场景。如果不这样做,可能会造成内存泄露。
我们来一步一步分析下是如何造成的。 

一,ThreadLocal在内存里怎么存的?


首先,Thread、ThreadLocal、目标对象在JVM中是这样存储的:
这里的Map其实不是常规的K/V存储的Map,具体在代码里如下图:
所以Key其实就是referent属性,该属性定义在WeakReference的父类里:

二,理解弱引用


当对象仅被弱引用引用时,垃圾回收器会在 下一次回收周期中回收该对象,无论当前内存是否充足。
Object obj = new Object();
WeakReference<Object> weakRef = new WeakReference<>(obj);
// 还有强引用,目标对象(obj指向的对象)不会回收
System.gc();
System.out.println(weakRef.get());  // 不为null// 断开强引用
obj = null; 
System.gc();
// 目标对象将被回收
System.out.println(weakRef.get());  // null

特别注意的是,这里涉及2个对象:
  • 目标对象的回收由弱引用机制保证。
  • WeakReference对象本身 的回收由普通 GC 规则决定,即如果还有它的强引用(如全局变量、集合),这个对象不会回收。

三,内存泄露如何发生?


内存泄露前提:不执行threadLocal.remove(),线程也不回收(如线程池核心线程)。
上图是典型内存泄露场景。
解释下,ThreadLocal没有强引用,所以只会在执行set(obj)之后,被当做 弱引用目标包装在ThreadLocalMap的Entry中。
手动执行GC后,ThreadLocal就被回收了,referent也就是null了。但value仍然以强引用引用着MyObject,也就不会释放和回收了。
内存泄漏的积累:
如果线程执行多次任务,创建了多个局部变量ThreadLocal且未清理,ThreadLocalMap 中可能会积累大量key=null的无效Entry,最终导致严重的内存泄露。
虽然ThreadLocalMap在调用get、set、remove时会扫描并移除key=null的Entry,但如果长期不调用这些方法,无效Entry还是会持续堆积。
所以建议ThreadLocal被定义成常量:
private static final ThreadLocal<Object> threadLocal = new ThreadLocal<>();
但这个并不影响内存泄露的发生,即threadLocal是否被弱引用回收不是决定是否内存泄漏。

四,内存泄露如何避免?


始终调用 remove(),且尽量避免存储大对象。
try {
    threadLocal.set(data);
    // 执行业务逻辑...
} finally {
    threadLocal.remove(); 
}

相关文章:

  • 健康养生:开启活力生活新篇章
  • 前端如何构建跨平台可复用的业务逻辑层(Web、App、小程序)
  • 守护进程编程以及ssh反向代理
  • C语言==》字符串断行
  • 每日文献(十四)——Part one
  • 前端:uniapp框架中<scroll-view>如何控制元素进行局部滚动
  • Vue3笔记
  • 文献分享 | 使用ANSYS Fluent进行除雾系统设计分析
  • LIB-ZC, 一个跨平台(Linux)平台通用C/C++扩展库, 多关键字搜索模块
  • vue3学习笔记之条件渲染
  • 关于EXPLAIN ANALYZE 工具的解析及使用方法(AI)
  • centos7更换yum源不生效
  • KingbaseV8
  • easyExcel单元格合并
  • 【TVM教程】microTVM TFLite 指南
  • C++11中的std::condition_variable
  • CCS编译器无法导入工程文件,检查原因是版本编译器编译问题
  • 自适应布局,平均分配,自动换行,上下对齐
  • 大模型相关面试问题原理及举例
  • java+postgresql+swagger-多表关联insert操作(九)
  • 今年以来金价涨幅超26%,未来会继续上涨吗?
  • 玉渊谭天丨这是一个时代的结束
  • 8个月女婴被指受虐后体重仅6斤?潮州警方:未发现虐待,父母有抚养意愿
  • 因在罗博特科并购项目中执业违规,东方证券、国浩所均遭警示
  • 云南:近两千亩拍得土地因规划变更不得开发,政府要求转型、企业无力为继
  • 法治课|男子同时与两名女子办婚礼闹剧,是否应受处罚?