64.ThreadLocal造成的内存泄漏

打印 上一主题 下一主题

主题 641|帖子 641|积分 1923

内存泄漏

步调中已动态分配的堆内存,由于某种缘故起因步调为释放和无法释放,造成体系内存的浪费,导致步调运行速率减慢乃至体系崩溃等严峻后果。内存泄漏的堆积终将导致内存溢出。
内存溢出

没有足够的内存提供申请者使用。
ThreadLocal出现内存泄漏的真实缘故起因

内存泄漏的发生跟ThreadLocalMap中的key是否使用弱引用是没有关系的。
内存泄漏发生的真正缘故起因是:
1.没有手动删除这个Entry。只要在使用完ThreadLocal,调用其remove方法删除对应的Entry,就能制止内存泄漏。
2.CurrentThread依然运行。由于ThreadLocalMap是Thread的一个属性,被当火线程所引用,所以它的生命周期跟Thread一样长。那么在使用完ThreadLocal的使用,假如当前Thread也随之执行结束,ThreadLocalMap自然也会被gc回收,从根源上制止了内存泄漏。
综上:ThreadLocal内存泄漏的根源是,由于ThreadLocalMap的生命周期跟Thread一样长,假如没有手动删除对应key就会导致内存泄漏。
制止内存泄漏有两种办法

1.使用完ThreadLocal,调用其remove方法删除对应的Entry。
2.使用完ThreadLocal,当前Thread也随之运行结束。
相对于第一种方式,第二种方式显然更不好控制,特殊是使用线程池的时候,线程结束时不会烧毁的。
所以,

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表