Java中线程TERMINATED了,对应线程的实例不会被GC进而GC掉threadLocals吗?

发布于 2022-09-12 02:30:27 字数 264 浏览 17 评论 0

问题的起因在于网上的资料广泛地说ThreadLocal使用弱引用避免内存泄漏。

可是当线程TERMINATED后,对应线程的实例不被GC吗?(当然,此处不考虑线程池那种一个线程复用的情况。)

线程对应的实例如果被GC了,那么实例内部的成员变量所保持的强引用不复存在,进而成员变量threadLocals指向的堆上的映射表被GC,于是映射表内部对每个键值对中键,值的强引用不复存在,下一次GC不就会把堆上的键和值都GC了么?这样不使用弱引用不也没有造成内存泄漏么?

谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

再浓的妆也掩不了殇 2022-09-19 02:30:27

不管线程会不会被复用的情况,ThreadLocal变量的值对象是保持着至少两个引用指向它:

  • 1)ThreadLocal变量内部引用值对象
  • 2)Thread中的threadLocals的哈希表中某一个Entry引用值对象

当线程销毁的时候,如果ThreadLocal没有及时remove掉,其实只是把1)引用去掉,2)引用仍然保留,此时值对象因为被引用,导致GC不会回收它。

下面我的一个图,可以帮助你理解:

ThreadLocal 的存储原理:弱引用

帅冕 2022-09-19 02:30:27

你自己已经回答了…

当然,此处不考虑线程池那种一个线程复用的情况。

很多时候还是要用线程池的
另外大多数时候都会remove的,这个弱引用终究是一个兜底

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文