hashMap的get()方法,错用并发造成cpu和负载高
2016-12-22 21:48
288 查看
一次线上问题的解决
线上发现服务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命令
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222213258901-1216343843.png)
2.jstack -l pid >dump.txt 获取dump文件
3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制 ,10587转换成十六进制后为295B,转换成小写为295b
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222213422386-577020427.png)
4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题
cat dump.txt | grep -10 295b
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222214102745-1104380566.png)
发现问题在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/
线上发现服务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命令
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222213258901-1216343843.png)
2.jstack -l pid >dump.txt 获取dump文件
3.使用top -H查询出消耗资源的线程号tid(十进制线程id),转换为16进制 ,10587转换成十六进制后为295B,转换成小写为295b
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222213422386-577020427.png)
4.cat dump.txt | grep -10 tid(16进制) 查询出该进程号上下10行,定位问题并解决问题
cat dump.txt | grep -10 295b
![](http://images2015.cnblogs.com/blog/597316/201612/597316-20161222214102745-1104380566.png)
发现问题在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耗光
- php并发对MYSQL造成压力的解决方法
- Java在并发情况下使用HashMap造成死循环
- HashMap源码注解 之 get()方法(五)
- leetcode 260. Single Number III --> 用hashmap计算出现的次数,注意containsKey获取key,用 get 方法获取值
- 【java并发】造成HashMap非线程安全的原因
- JAVA中hashmap.get()导致CPU占用过高问题
- HashMap.put/get方法
- 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
- Java HashMap的数据结构以及put和get方法
- HashMap的put、get方法分析与Hash冲突的分析、解决
- 并发场景下HashMap死循环导致CPU100%的问题
- 高并发访问时如何确保服务器端session过多而造成内存溢出致使服务器宕机的方法之一
- 网站[高并发]下使用[静态方法]会造成页面无法访问
- 在多线程环境中使用HashMap会有什么问题?在什么情况下使用get()方法会产生无限循环?
- Sqoop导表在大并发下造成RegionServer的系统cpu过高
- php并发对MYSQL造成压力的解决方法
- 网站[高并发]下使用[静态方法]会造成页面无法访问
- IAR下载: Failed to get cpu status after 4 retrie 的解决方法
- HashMap在高并发下导致CPU过高