所有分类
  • 所有分类
  • 未分类

Java-ThreadLocal导致内存泄露的原因和解决方案

简介

本文介绍为什么ThreadLocal会引起内存泄露以及如何避免ThreadLocal内存泄露。

之前介绍过ThreadLocal的原理,本文不再赘述。

本内容也是Java面试时经常会问到的问题。

key内存泄露的避免

每个 Thread 里都有一个 ThreadLocalMap,而 ThreadLocalMap 中真正承载数据的是一个 Entry 数组,Entry 的 key 是 threadlocal 对象的弱引用。

Entry 的 key 是 threadlocal 对象的弱引用,这是为了避免key的内存泄漏。(弱引用:垃圾回收时,无论内存是否足够,都会回收弱引用对象。详见:这里

为什么Entry的key是弱引用可以避免内存泄露呢?原因是:Entry的key是弱引用,这样当我们程序里不再使用这个ThreadLocal的时候,垃圾回收时就能够将Entry里的这个ThreadLocal这个key回收掉了。假如是强引用,那么就算我们不再使用此ThreadLocal,但由于Entry的key还持有此ThreadLocal的强引用,垃圾回收时就无法回收此ThreadLocal,那么就导致了内存泄露。

value内存泄露的原因

此内容仅限VIP查看,请先
1

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录