ThreadLocal为什么要使用弱引用和内存泄露问题.docxVIP

ThreadLocal为什么要使用弱引用和内存泄露问题.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
ThreadLocal为什么要使用弱引用和内存泄露问题 每个thread中都存在一个map, map的类型是ThreadLocal.ThreadLocalMap. Map中的key为一个threadlocal实例. 这个Map的确使用了弱引用,不过弱引用只是针对key. 每个key都弱引用指向threadlocal. 所以当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal就可以顺当被gc回收 留意!假如每个key都强引用指向threadlocal,也就是上图虚线那里是个强引用,那么这个threadlocal就会由于和entry存在强引用无法被回收!形成内存泄漏?,除非线程结束,线程被回收了,map也跟着回收。 - 照旧消灭的内存泄露问题 - 虽然上述的弱引用处理了key,也就是线程的ThreadLocal能准时被回收,但是value却照旧存在内存泄漏的问题。 当把threadlocal实例置为null以后,没有任何强引用指向threadlocal实例,所以threadlocal将会被gc回收. map里面的value却没有被回收.而这块value永久不会被访问到了. 所以存在着内存泄露, 由于存在一条从current thread连接过来的强引用. 只要当前thread结束以后, current thread就不会存在栈中,强引用断开, Current Thread, Map, value将全部被GC回收. - 结论 - 所以当线程的某个localThread使用完了,马上调用threadlocal的remove方法,那就啥事没有了! 另外其实只需这个线程对象准时被gc回收,这个内存泄露问题影响不大,但在threadLocal设为null到线程结束两头这段时间不会被回收的,就发生了我们认为的内存泄露。    最要命的是线程对象不被回收的情况,这就发生了真正意义上的内存泄露。 比如使用线程池的时候,线程结束是不会销毁的,会再次使用的。就可能消灭内存泄露。 - 补充说明?- Java为了最小化削减内存泄露的可能性和影响,在ThreadLocal的get,set的时候都会清除线程Map里全部key为null的value。 所以最怕的情况就是: threadLocal对象设null了,开头发生“内存泄露”,然后使用线程池,这个线程结束,线程放回线程池中不销毁,这个线程一直不被使用,或者安排使用了又不再调用get,set方法,那么这个期间就会发生真正的内存泄露。 推举阅读: 详解 CQRS 架构模式 对 Kafka 和 Pulsar 进行功能测试后,拉卡拉将消息平台统一换成了 Pulsar 顺丰科技架构升级之路 聊聊数据库中的那些锁 浅谈Kafka中acks参数对消息长久化的影响 关注我 学习架构学问

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档