最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的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

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

  1. magento 由于Httpd进程增多,导致CPU占用100%问题

    由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...

  2. 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

    再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...

  3. 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记》[转]

    转载地址:http://bbs.chinaunix.net/archiver/tid-1823500.html 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 ...

  4. w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法

    对于IIS 管理员来说,经常会碰到 Web 服务器 CPU 占用 100% 的情况,以下是个人的日常工作总结和一些解决办法,主要用来剖析 w3wp.exe(IIS )  占用 CPU 100% 的一些 ...

  5. VPS/云主机CPU占用100%故障排查

    VPS/云主机CPU占用100%故障排查 方法/步骤 通常情况下云主机/VPS的CPU一般不会占用100%,内存资源也不会占完.若您的服务器经常CPU资源100%,可以打开任务管理器,查看是哪个进程引 ...

  6. mysql cpu 100% 满 优化方案 解决MySQL CPU占用100%的经验总结

    下面是一些经验 供参考 解决MySQL CPU占用100%的经验总结 - karl_han的专栏 - CSDN博客 https://blog.csdn.net/karl_han/article/det ...

  7. 解决 MYSQL CPU 占用 100% 的经验总结

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 ...

  8. Web API的CPU占用100%

    我用Web API做了一个网站,网站很简单,请求就是几个普通的参数,提交到服务器后,在Web API里做一下参数验证,然后去访问Redis里的TIME命令,最后把TIME命令返回的结果计算出yyyy- ...

  9. paip.navicat form mysql导入文本文件时CPU占用100%的解决

    paip.navicat form  mysql导入文本文件时CPU占用100%的解决 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:h ...

随机推荐

  1. iframe - 基本用法

    · 用target的值,指向iframe框架的name值. <body> <form id="form1" runat="server"> ...

  2. Tomcat详细用法学习(二)

    本篇接上一篇<Tomcat详细用法学习(一)>,主要讲解服务器的虚拟目录映射的几种方式. 先来看几个概念: web应用的概念:一个web应用包含了许多我们做好的web资源,里面或许包括了多 ...

  3. WinExec函数,启动其他应用程序

    WinExec The WinExec function runs the specified application. Note  This function is provided only fo ...

  4. 【Demo 0009】Java基础-异常

    本章学习要点:       1.  了解异常的基本概念:       2.  掌握异常捕获方法以及注意事项;       3.  掌握异常抛出方法:       4.  掌握自定义异常类和异常类继承注 ...

  5. Flume 1.5日志收集和存款mongodb安装结构

    Flume该演示是不是说.你可以自己搜索. 但现在的互联网主要是Flume 1.4前版本号的信息.Flume 1.5在轰动的大变化.假设你准备尝试,我在这里给大家介绍一下程序最小化结构,和使用Mong ...

  6. Android手机便携式wifi的使用及无线数据传输(主要针对XP系统)

    适用条件: 1.可以上网的安卓系统2.2以上的智能手机,或有便携式wifi功能的安卓智能手机 2.有无线网卡的笔记本电脑或台式机(特别是XP系统) 测试手机:中兴U930 电脑:华硕K50系列笔记本 ...

  7. 转载【浅谈ThreadPool 线程池】

    浅谈ThreadPool 线程池 http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html

  8. ExtJs4 笔记(10) Ext.tab.Panel 选项卡

    本篇讲解选项卡控件. 一.基本选项卡 首先我们来定义一个基本的选项卡控件,其中每个Tab各有不同,Tab的正文内容可以有三种方式获取: 1.基本方式:通过定义html和items的方式. 2.读取其他 ...

  9. POJ 2991 Crane(线段树+计算几何)

    POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...

  10. hdu 1530 Maximum Clique

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1530 题目分类:最大团问题 DP + DFS 代码: #include<bits/stdc++. ...