jvm,导致cpu过高问题和排查演示

实验环境:cenos7

实验代码

模拟一段死循环的代码

/**
     * 死循环Map测试
     * 解决死循环问题:因为dataMap为空的时候,iterator.next()一直没有被调用到,就会导致死循环
     */
    public  Map<String, Object> deadIterator() {
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("onekey", new Object());
        Map<String, Object> dataMap = new HashMap<>();
        Iterator<String> iterator = paramMap.keySet().iterator();
        while (iterator.hasNext()) {
            System.out.println("iterator.hasNext()");
            for (String keySet : dataMap.keySet()) {
                System.out.println("for.dataMap.keySet()()");
                if(iterator.next().equals(keySet)){
                    iterator.remove();
                }
            }
        }
        return paramMap;
    }

实验步骤

在controller中,外部调用死循环的代码

 /**
     * 导致cpu飙高
     * @return
     */
    @RequestMapping("/deadIterator")
    @ResponseBody
    public String deadIterator() {
        deadLockService.deadIterator();
        return "deadIterator";
    }

部署项目到linux环境并启动简单演示

java -Xmx32M -Xms32M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -jar order-0.0.1-SNAPSHOT.jar &

调用接口:发现cpu飙高

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

排查演示

第一步:top命令,观察到pid  4906占用高

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

第二步:jps -l,果然是我们java应用对应pid=4906

20200206114352402.png

第三步:导出线程栈信息,生成目录在本地,当然你也可以直接在服务器看

直接jstack 4906 即可。

jstack 4906  >> 4906.txt

20200206114748570.png

线程文件导出

sz 4906.txt

打开分析:找一下没有可疑的信息,果真如图所示,定位到我们代码,导致排查完毕。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3NzIyMzA=,size_16,color_FFFFFF,t_70

 

补充命令示例


top -Hp pid

printf "%x\n" 线程pid


jstack pid | grep 转换成16进制的数值 -A 30


jstack pid


sudo jsatck pid >> 789.txt

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值