HashMap-死锁导致cpu占用100%分析
2010-12-28 19:40
232 查看
最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下。
先放出问题的代码
死锁就出现在了while (e != null);从上面的代码看来,每一个线程进来都先执行 codeMap = new HashMap();这个时候codeMap是空的,所以在执行下面的操作的时候进入了某一个不可以随意
更改状态的代码中,再加上高并发,一直被new HashMap(),while一直被执行,变成了死循环。cpu就瞬间飙升到100%,一直持续到请求数降低的时候。
最后解决办法:重构这部分代码,这部分代码本来就是写的不正确。再将HashMap改为ConcurrentHashMap,线程安全的Map。
线上观察很多天,一切正常。
先放出问题的代码
这一段代码有点漏洞百出,在调用getAlimamaCodeByKey的时候,高并发下,会出现hashmap的死锁,导致cpu100%。至于这个代码为什么写出这样,就暂时不叙述了,就来分析一下出现死锁的原因是什么。 每一次调用getAlimamaCodeByKey的时候,首先是去初始化这个hashmap,在初始化时,这个hashmap void transfer(Entry[] newTable) { Entry[] src = table; int newCapacity = newTable.length; for (int j = 0; j < src.length; j++) { Entry<K,V> e = src[j]; if (e != null) { src[j] = null; do { Entry<K,V> next = e.next; int i = indexFor(e.hash, newCapacity); e.next = newTable[i]; newTable[i] = e; e = next; } while (e != null); } } }
死锁就出现在了while (e != null);从上面的代码看来,每一个线程进来都先执行 codeMap = new HashMap();这个时候codeMap是空的,所以在执行下面的操作的时候进入了某一个不可以随意
更改状态的代码中,再加上高并发,一直被new HashMap(),while一直被执行,变成了死循环。cpu就瞬间飙升到100%,一直持续到请求数降低的时候。
最后解决办法:重构这部分代码,这部分代码本来就是写的不正确。再将HashMap改为ConcurrentHashMap,线程安全的Map。
线上观察很多天,一切正常。
相关文章推荐
- HashMap-死锁导致cpu占用100%分析(转)
- [原]分析Vista导致资源管理器占用CPU资源100%的问题的原因及解决办法
- Key的小于操作符号重载不正确导致map占用CPU占用100%的分析
- Tomcat CPU占用100%异常分析与处理
- java应用CPU占用100%内存泄漏分析总结(转载)
- IIS应用程序池w3wp.exe CPU 占用100% 分析软件,找出具体有问题的ASP程序URL
- DBA案例分析:如何解决CPU占用100%的问题
- 一例并发导致网站cpu 占用100% 的处理
- cisvc.exe导致CPU占用100%的解决方法。
- 一例由于一网站cpu占用过高导致服务器cpu占用始终是100%的问题解决
- JAVA应用CPU占用100%|内存泄漏分析总结
- DBA案例分析:如何解决CPU占用100%的问题
- Linux jstack分析cpu占用100%
- DBA案例分析:如何解决CPU占用100%的问题
- DBA案例分析:如何解决CPU占用100%的问题
- 导致eclipse在空闲时CPU一直占用100%或50%的原因及解决
- java cpu占用100%分析
- 导致eclipse在空闲时CPU一直占用100%或50%的原因及解决
- jstack分析cpu占用100%
- 并发场景下HashMap死循环导致CPU100%的问题