ThreadLocalMap 中的 key 使用强引用会出现内存泄漏吗

一 弱引用和内存泄漏

有些程序员在使用 ThreadLocal 的过程中会发现有内存泄漏的情况发生,就猜测到这个内存泄漏跟 Entry 中使用了弱应用的 key 有关系,这个理解是不对的。

二 内存泄漏相关概念

Memory overflow:内存溢出,没有足够的内存提供申请者使用。

Memroy leak:内存泄漏,程序中已分配的堆内存由于某种原因未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重的后果。内存泄漏的堆积将导致内存溢出。

三 弱引用相关概念

Java 中的引用有4种类型:强、弱、软、虚。当前这个问题主要涉及强引用和弱引用。

强引用:就是我们最常用的普通对象引用,只要有强引用指向一个对象,就能表明对象还活着,垃圾回收器就不会回收这种对象。

弱引用:垃圾回收器一旦发现了只有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

四 如果 key 使用强引用

假设 ThreadLocalMap 中的 key 使用了强引用,那么会出现内存泄漏吗?

此时 ThreadLocal 的内存图如下:

1 假设在业务代码中使用完 ThreadLocal,threadLocal Ref 被回收了。

2 但是因为 threadLocalMap 中的 Entry 强引用了 threadLocal,造成 threadLocal无法被回收。

3 在没有手动删除这个 Entry 以及 currentThread 依然运行的前提下,始终有强引用链 threadRdf > currentThread > threadLocalMap > entry,Entry 就不会被回收(Entry 包括了 ThreadLocal 引用和 value),导致 Entry 内存泄漏。

也就是说,ThreadLocalMap 中的 key 就算使用了强引用,是无法完全避免内存泄漏的,而且情况更糟。

这种情况下,堆中任何对象都无法回收。因为都被强引用链引着。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值