ThreadLocal如何避免内存泄露

1 ThreadLocal的设计

每个线程Thread都有一个ThreadLocalMap属性,这个ThreadLocalMap类似HashMap,不过ThreadLocalMap是通过“线性探测法”解决的哈希冲突。

 2 ThreadLocal在堆栈中如何存放的

  • 首先我们明确key是使用了弱引用,当把threadlocal变量置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal实例就可以顺利被 gc。

  • 我们从图中也能看到虽然key被gc回收了,但是value还在呀。因为存在一条从 current thread连接过来的强引用。只有当前thread结束以后,current thread 就不会存在栈中,强引用断开,Current Thread, Map, value将全部被GC回收。

总结:就算map的Entry没有被显示的清除,如果线程被销毁,也是可以避免内存泄露的。

备注:JDK7的ThreadLocal

从图中可以看到,map中的key是Thread对象、value是当前线程的局部变量值。当线程销毁即key被回收后,ThreadLocal依然存在,即map中的value无法被回收。所以,如果map的Entry没有被显示的清除,就会导致内存泄露。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值