zoukankan      html  css  js  c++  java
  • 记一次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使用率偏高的问题,都应该可以通过以上的解决思路来进行定位。

  • 相关阅读:
    洛谷 P1410 子序列(DP)
    LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)
    LibreOJ #541. 「LibreOJ NOIP Round #1」七曜圣贤(单调队列)
    浴谷八连测R6题解(收获颇丰.jpg)
    数论的一些小结论
    Fence9
    二模 (2) day1
    二模 (1) day2
    二模 (1) day1
    一些编码时的老错误
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5487531.html
Copyright © 2011-2022 走看看