• 记一次java应用cpu利用率过高调试经历


    1,现象

    写的一个storm应用,主要是通过mysql的binlog来同步表到hbase。运行一段时间后发现,经常会出现cpu使用率飙升到200%以上,然后各种消息堆积报警等等出现各种问题

    2,调研过程

    cpu使用率很高,所以首先找到该进程,通过top命令,监控该进程的使用率,然后通过H,查看各个线程的cpu使用率情况,记下cpu使用率高的线程id,然后通过jstack pid,获取各个线程栈,听过top获取的线程id转化成16进制后,发现有问题的线程栈如下:

    发现主要问题原来出现在HashMap的put上。很奇怪只用了一个spout应该是单线程,但是后来发现客户端这边是多线程从nsq取数据的。HashMap不是线程安全的,所以用在多线程中,会出现死循环造成cpu使用率偏高。具体原因可以参看:http://coolshell.cn/articles/9606.html

    3,处理方法:

    发现问题,通过代码发现转化json到map以后没有指定concurrentHashMap,然后又put了数据造成的,直接通过替换成concurrentHashMap就好了

    4,小结

    hashmap不是线程安全的,在多线程过程中一定不要使用。另外,碰到java应用cpu使用率偏高的问题,都应该可以通过以上的解决思路来进行定位。

  • 相关阅读:
    第四次博客
    第三次作业
    第二次作业
    入学的第一次作业
    第四次作业
    第三次作业
    第二次随笔作业
    第一次随笔
    第四次作业
    第三次作业
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5487531.html
Copyright © 2020-2023  润新知