码迷,mamicode.com
首页 > 其他好文 > 详细

hashMap的get()方法,错用并发造成cpu和负载高

时间:2016-12-22 22:49:03      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:过程   uil   images   txt   infinite   应该   变量   共享   上下   

一次线上问题的解决

线上发现服务cpu使用达到98%,负载高达200多,64核心cpu,下面介绍解决过程:

1.top命令查出占用cpu高的进程pid

2.使用jstack -l pid >dump.txt 获取dump文件

3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制

4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题

=====================================================

1.使用top命令

技术分享

2.jstack -l pid >dump.txt 获取dump文件

3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制  ,10587转换成十六进制后为295B,转换成小写为295b

技术分享

 

4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题

cat dump.txt | grep -10 295b

技术分享

 

发现问题在hashMap的get方法,count发现有200多个的runnable状态在调用hashMap的get方法,经过查找ServiceBuilder的第592行发现在一个公共静态方法中使用了一个类全局变量的HashMap作为 共享变量被并发使用,第592行是get方法,经过查找发现在1.7的get方法中有e.next();方法造成cpu无限循环。于是把HashMap改成了ConcurrentHashMap.问题应该解决了,待上线验证。(注该问题不一定会100%发生)

 

另见(关于hashMap的循环bug):http://ifeve.com/hashmap-infinite-loop/

hashMap的get()方法,错用并发造成cpu和负载高

标签:过程   uil   images   txt   infinite   应该   变量   共享   上下   

原文地址:http://www.cnblogs.com/zhangshiwen/p/6212977.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!