关于ThreadLocal管理资源出现内存泄漏问题的补充


之前没想过这个问题,这里带着一些小疑问整理一下。

ThreadLocal 内存泄漏问题

Tip:2024-04-10

为什么会发生内存泄漏问题

首先我们都知道 ThreadLocal 是通过把自身对象作为 key,要管理的资源作为 value 在线程内部 map 对象中进行存储的。

而这个 key 是弱引用,vlaue 是强引用。既然是弱引用,如果这个 ThreadLocal 对象没有被其他程序引用,那可能就会被 JVM 垃圾回收掉,那会出现什么情况?空 key!那 value 永远无法被访问到,而且也不会被清理掉,这就是内存泄漏问题

避免方法:尽量在使用完后,调用 remove 方法手动删掉资源对象,避免出现内存泄漏问题

而且 threadlocal 在设计的时候也会在调用 get,set,remove 方法时判断 key 是否为 null 了,如果为 null 直接就清理掉这个键值对。

小问题:Threadlocal 对象为什么是弱引用?咋判断的?

  • 设计为弱引用是为了避免内存泄漏!!??

原因在于,如果是强引用的 key,说明这个 threadlocalmap 只要用到了这个 ThreadLocal 对象作为 key,那就是强引用。这有啥问题?只要线程一直活跃,那 Threadlocalmap 中就一直保留着 Threadlocal 的对象,哪怕没有被用到,也不会被回收(强引用),那不就是内存泄漏问题吗?

所以设计为弱引用,只要我们注意 remove 掉不用的资源,加上 Threadlocal 自己的优化,能尽可能的避免内存泄漏问题。


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
评论
  目录