栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

ThreadLocal引起的内存泄漏

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

ThreadLocal引起的内存泄漏

ThreadLocal引起的内存泄漏

1、什么是内存泄漏

内存泄漏,即已经申请的内存空间无法释放,就会造成内存泄漏,例如线程死循环、资源不关闭等,大量的内存泄漏堆积就会造成内存不够,从而发生内存溢出。

JVM内存模型和常见内存溢出

2、TreadLocal内存泄漏的场景

TreadLocalMap的Entry继承了WeakReference>,即Entry的key是弱引用(该引用只存在弱引用的情况下,下一次GC会回收这个引用对象,可以参考Java基础篇-引用类型之强引用、软引用、弱引用和虚引用)。让我们一起看下如下应用场景:当线程存在多个ThreadLocal时,其中的一个或几个ThreadLocal的引用在线程运行中,在没有执行remove的情况下被设置为null,即释放了强引用,ThreadLocal对象只有Entry的弱引用了。下次gc被回收,key是弱引用被回收,value是强引用一直存储在内存中。线程还在运行,value的内存就不会释放,这样发生了内存泄漏。

单个线程的情况下,线程结束的时候,内存泄漏的value会被回收,不会有什么问题。不过使用的线程池呢,线程是常备线程,会一直运行下去,这样value内存会被一直占用,并且可能会不断增加,这样就严重了。那需要怎么来避免和解决呢。

3、解决方法

这个没有太好的解决方案,只能通过规范代码使用来解决,上一章中说到expungeStaleEntry方法,会将这种key引用已经失效的entry对象释放。所以为了避免内存泄漏,在ThreadLocal使用结束以后,规范操作,执行下remove方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/930226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号