ThreadLocal 内存模型、内存泄漏原因、现象观测、解决

本文探讨了ThreadLocal的内存模型,指出每个线程持有一个ThreadLocalMap,其Entry基于弱引用。当ThreadLocal对象变为弱引用时,GC会清除。文章详细解释了ThreadLocal内存泄漏的原因,通过实例展示了泄漏现象,如在特定环境下即使Full GC也无法释放内存。解决办法是在不再使用ThreadLocal时调用remove()。实验表明,有时GC仍能有效回收内存。
摘要由CSDN通过智能技术生成

虚引用(WeakReference)

在开始之前,需要区分 Java 引用中的强、软、弱、虚引用,ThreadLocal 使用了弱引用,它是问题的关键。

只有弱引用指向的对象,只要进行 GC 时便会被清除。

ThreadLocal 内存模型

每个线程自己保存一个 Map,即 ThreadLocalMap,这个 Map 以 ThreadLocal 对象为键,且 ThreadLocalMap 的 Entry 继承了 WeakReference 类,是一个对 ThreadLocal 对象的弱引用,源码如下(ThreadLocal.ThreadLocalMap.Entry)。

使用 ThreadLocal 时容易产生一种感觉,即我们保存的数据似乎保存在 ThreadLocal 对象上,实际上它们保存在当前的 Thread 对象上。ThreadLocal 只是提供了一个操作的框架。

ThreadLocal 内存泄漏原理

如果我们在线程中使用 ThreadLocal 不当,将会导致保存的数据无法被回收,过程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值