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

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

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

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

谢谢

回答

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

1)ThreadLocal变量内部引用值对象

2)Thread中的threadLocals的哈希表中某一个Entry引用值对象

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

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

cb58c14b93aa58aef83894fea3eccb74.png

你自己已经回答了…

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

很多时候还是要用线程池的

另外大多数时候都会remove的,这个弱引用终究是一个兜底

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值