ThreadLocal为什么会导致内存泄漏?如何解决?

ThreadLocal导致内存泄漏的原因其实就是他在堆上存储的ThreadLocalMap中的K-V部分:

ThreadLocalMap的key就是ThreadLocal对象,他有两个引用源,一个是栈上的ThreadLocal引用,一个是ThreadLocalMap中的Key对他的引用。

value只有一条引用,就是从Thread对象过来的。

所以就会产生以下两种情况:
一、栈上的ThreadLocal ref引用不再使用了,但是因为ThreadLocal对象还有一条引用链导致他无法被回收,时间长了可能就发生OOM.

二、Thread对象如果一直在被使用,比如在线程中被重复使用,那么他的引用链也会一直存咋,就会导致ThreadLocalMap无法被回收

解决方法:

为了解决这个问题,ThreadLocalMap使用了弱引用,这样ThreadLocal对象就可以在下次GC时被垃圾回收掉了,可以很大程度上避免因为ThreadLocal的使用导致的OOM问题,但是没法彻底避免。

第二种因为Thread对象一直存在导致的OOM可以采用每个ThreadLocal用完之后,手动调用一下remove,就可以在下次GC时把Entry清理掉

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值