HashMap-死锁导致cpu占用100%分析(转)

 

最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下。

 

先放出问题的代码

 

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

private AlimamaCodeDAO alimamaCodeDAO;

 

   private Cache cache;

 

   /**

    * @param cache the cache to set

    */

   public void setCache(Cache cache) {

       this.cache = cache;

   }

   private Map codeMap; // KEYCODE与KEYNAME

 

 

   public List<AlimamaCodeDO> getAlimamaCodeByKey(String key) throws BOException {

       initCodeMap();

       return (List<AlimamaCodeDO>) codeMap.get(key);

   }

 

   private void initCodeMap() throws BOException {

       try {

           //Element element = cache.get(CacheKeyConstants.ALIMAMACODE_KEY);

           //if (element == null) {

               List codes = alimamaCodeDAO.findAllAlimamaCode();

               codeMap = new HashMap();

               for (int i = 0; i < codes.size(); i++) {

                   AlimamaCodeDO codeDo = (AlimamaCodeDO) codes.get(i);

                   if (!codeMap.containsKey(codeDo.getKey())) {

                       List list = new ArrayList();

                       list.add(codeDo);

                       codeMap.put(codeDo.getKey(), list);

                   } else {

                       ((List) codeMap.get(codeDo.getKey())).add(codeDo);

                   }

               }

               //element = new Element(CacheKeyConstants.ALIMAMACODE_KEY, (Serializable) codeMap);

               //cache.put(element);

           //}

           //codeMap = (Map) element.getValue();

       } catch (DAOException e) {

           throw new BOException("获取系统编码表时出现异常", e);

       }

   }

这一段代码有点漏洞百出,在调用getAlimamaCodeByKey的时候,高并发下,会出现hashmap的死锁,导致cpu100%。至于这个代码为什么写出这样,就暂时不叙述了,就来分析一下出现死锁的原因是什么。

 

  每一次调用getAlimamaCodeByKey的时候,首先是去初始化这个hashmap,在初始化时,这个hashmap

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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。

 

线上观察很多天,一切正常。

http://www.cnblogs.com/Baichuan/archive/2010/12/28/1919001.html

 

时间: 2024-08-29 09:38:48

HashMap-死锁导致cpu占用100%分析(转)的相关文章

因硬盘错误导致CPU占用100%问题

相信很多朋友都遇到过CPU占用率100%的情况,那会导致系统慢如蜗牛.半小时前,笔者正在玩游戏,电脑突然行动迟缓,打开任务管理器,发现CPU占用率100%,而且过多占用CPU的进程并不固定,像击鼓传花般在各进程间来回传递. 我当时的软件环境是:Windows XP SP3系统.开着迅雷下载.金山毒霸全套防御.超级兔子上网精灵.两个QQ.千千静听.游戏<太阁立志传Ⅴ>. 故障解决步骤如下: 经过查杀,系统并未中病毒.接着,我将网络断开,用冰刃将包括金山毒霸以及explorer.exe在内的非系统

CPU占用100%原因及解决方法

我们在使用Windows XP操作系统的时候,用着用着系统就变慢了,一看"任务管理器"才发现CPU占用达到100%.这是怎么回事情呢?遇到病毒了,硬件有问题,还是系统设置有问题,在本文中笔者将从硬件,软件和病毒三个方面来讲解系统资源占用率为什么会达到100%. CPU占用率高的九种可能: 1.防杀毒软件造成故障 由于新版的KV.金山.瑞星都加入了对网页.插件.邮件的随机监控,无疑增大了系统负担.处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务吧,或者,升级你的硬件配备. 2.

Eclipse的CPU占用100%

问题描述 Eclipse的CPU占用100% 最近eclips 经常莫名其妙的占用CPU 100%, 每次都要等半天.重装,配置eclipse.ini参数都不起作用, 后来用 java VisuaIVM查看eclipse线程占用问题发现org.eclipse.core.internal.jobs.WorkerPool.sleep(),占用很大自动时间,如图,是这个原因导致的么?怎么停止这个东西 解决方案 机子是Ubuntu12.04,老是无响应.重装eclipse至最新的4.2.1,再是改ecl

MySQL服务器进程CPU占用100%的解决方法_Mysql

朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 database, 分别给十个网站调用.据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了.一启用,则马上上升. MYSQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下.目前此网站的七日平均日 IP 为

cpu-mysql锁表会导致CPU占用很高么,求答案,。。。。。。。。

问题描述 mysql锁表会导致CPU占用很高么,求答案,........ 今天发布的项目锁表了,导致后面CPU超高,是锁表的原因么...... 解决方案 你这样子问,很难回答,只能说有可能

求救-网站服务器被CC攻击,导致cpu高达100%。请教高手解决方法!

问题描述 网站服务器被CC攻击,导致cpu高达100%.请教高手解决方法! 网站服务器被CC攻击,w3pw进程超过25%导致cpu高达100%.请教高手解决方法!

MySQL CPU 占用 100% 的解决过程

MySQL CPU 占用 100% 的解决过程 服务器解决了 MySQL CPU 占用 100% 的问题,稍整理如下,希望对各位有所帮助. 朋友主机 (. MySQL CPU 占用 100% 的解决过程 今天早上仔细检查了一下.目前此网站的七日平均日 IP 为2000,PageView 为 3万左右.网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB.按这个数据,MySQL 不可能占用这么高的资源. 于是在服务器上运行命令,将 MySQL 当前的环境变量输出到

Windows Server 2008运行斗地主CPU占用100%的解决办法

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   开启server2008桌面体验后,在VISTA主题下,QQ斗地主游戏CPU占用100%,(采用经典主题时QQ斗地主游戏CPU占用正常,但在斗地主的同时启用酷我音乐盒或酷狗音乐后,CPU占用同样达到100%). 受安装酷我音乐盒提示"必须安装WINDOWS PLAYER9或以上版本"的启示,可能是2008的windows player安装功能

CPU占用100%解决办法

一般情况下CPU占了100%的话我们的电脑总会慢下来,而很多时候我们是可以通过做 一点点 的改动就可以解决,而不必问那些大虾了. 当机器慢下来的时候,首先我们想到的当然是任务管理器了,看看到底是哪个程序占了较搞的比例,如果是某个大程序那还可以原谅,在关闭该程序后只要 CPU正常了那就没问题:如果不是,那你就要看看是什幺程序了,当你查不出这个进程是什幺的时候就去google或者 baidu 搜.有时只结束是没用的,在 xp下我们可以结合msconfig里的启动项,把一些不用的项给关掉.在2000下