技术控

    今日:95| 主题:49531
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] ThreadLocal内存泄露

[复制链接]
恨迟诀誓沒再 发表于 2016-11-28 08:03:38
170 2

立即注册CoLaBug.com会员,免费获得投稿人的专业资料,享用更多功能,玩转个人品牌!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
我见过许多内存泄漏是由于ThreadLocal的模式使用不当造成的。而鉴于我昨天在我们自己的一个应用程序中遇到了这个问题,我打算写一篇关于此的博客。
   Java中的ThreadLocal 变量用于 将变量同 当前线程 绑定 ,每个线程都有自己独立的  ThreadLocal变量  。这些变量通常用于 保存一些变量的状态信息 ,   譬如用户信息这种在整个应用中都使用的到并且你不想在每个方法中都重新声明  。  
   ThreadLocal 的生命周期和它相应的线程直接关联。如果线程被终止并且被垃圾回收器收集,它相应的ThreadLocal 变量  也将会被回收  。
   内存问题主要发生在当ThreadLocal变量使用在运行在应用服务器上的Java EE应用程序里边时。应用服务器通过使用线程池来管理线程以保证资源安全和提高性能。(参见Tomcat 6 HTTP conncector配置为例)。例如,一个HttpServletRequest发送到应用服务器的ServletEngine,一个空闲的线程将会从线程池中取出并且和servlet的应用逻辑进行连接。如果这个servlet或者它调用的Java类正在使用ThreadLocal变量,这些变量将会和当前的工作线程连接。如果servlet完成并将相应发送给客户端,那么与之连接的线程会被返回到线程池中,以便用来处理其他的请求。这意味着线程对象及其相   关联   的ThreadLocal变量 没有被垃 圾回收器收集,因为其线程对象还存在着。
   根据池中的线程数量(在运行环境中大于100个线程是正常的)以及ThreadLocal变量中对象的大小, 可能会发生 致命的内存问题。例如对线程池中的200个线程进行配置以及将ThreadLocal变量的大小设置为5MB,这将会导致有1GB的堆空间被这些变量所占用。这将会导致一个GC的开销并且 可能 会由于OutOfMemoryError导致JVM崩溃。
   在   实际   情况下,服务器必须每天进行重启以避免OutOfMemoryError问题。为了分析这个问题我们在运行期间拿出一个  heapdump  (参见最近的博客所做)。我用Eclipse MAT对这个  dump  进行了分析, 它 非常迅速地显示出我们存在的Threadlocal内存问题。
   
ThreadLocal内存泄露-1 (应用程序,服务器,客户端,Java,博客)

   上面的截图显示的是   dump   的   支配树   。我标记了6个线程,每个线程占用14MB的堆内存。
   下一个截图显示了这些线程的具体细节。高内存消耗是ThreadLocal变量造成的结果,它引用了一个DOMParser并且其解析文档占用了总共14MB的大小。因为MAT也可以显示对象的内容, 所以 我们可以很容易地看到parsers是由于我们的 WebServices 引起的。 WebService类由JBoss WS生成 。 Google表明这是jbossws1.2.0版本中的Bug引起的,而这在1.2.1的版本中得到了修复。“DOMUtils并不清除本地线程”。所以我们需要对JBoss AppServer用最新发布的jbossws进行补丁,这样问题就解决了 。

ThreadLocal内存泄露-2 (应用程序,服务器,客户端,Java,博客)

  这个例子表明,当你在一个应用服务器里使用ThreadLocal时,你必须小心。如果一个被间接引用的ThreadLocal变量不再使用时,对其进行处理是至关重要的。通常我们使用ServletFilters做这个工作。
   原文链接: codecentric 翻译:ImportNew.com -LW
译文链接:[]
友荐云推荐




上一篇:Java语法糖(1):可变长度参数以及foreach循环原理
下一篇:Geoip可视化攻击图谱:打造专属的炫酷风
酷辣虫提示酷辣虫禁止发表任何与中华人民共和国法律有抵触的内容!所有内容由用户发布,并不代表酷辣虫的观点,酷辣虫无法对用户发布内容真实性提供任何的保证,请自行验证并承担风险与后果。如您有版权、违规等问题,请通过"联系我们"或"违规举报"告知我们处理。

刘肖 发表于 2016-12-2 19:35:57
楼下的,觉得比特币咋样啊?
回复 支持 反对

使用道具 举报

安于现状 发表于 2016-12-2 23:30:06
新人求罩求粉求眼熟求认识求包养
回复 支持 反对

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我要投稿

推荐阅读

扫码访问 @iTTTTT瑞翔 的微博
回页顶回复上一篇下一篇回列表手机版
手机版/CoLaBug.com ( 粤ICP备05003221号 | 文网文[2010]257号 )|网站地图 酷辣虫

© 2001-2016 Comsenz Inc. Design: Dean. DiscuzFans.

返回顶部 返回列表