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使用率偏高的问题,都应该可以通过以上的解决思路来进行定位。

  • 相关阅读:
    千里之行,始于足下
    Asp.Net构架(Http请求处理流程)
    c# MVC5(二) MVC与IOC结合
    c# MVC5(一) 初步认识以及新建mvc
    使用C#创建Windows服务
    Cron Expressions——Cron 表达式(QuartZ调度时间配置)
    定时调度之Quartz
    ORM之EF初识
    Redis原理及使用
    为什么使用 Redis 及其产品定位
  • 原文地址:https://www.cnblogs.com/superhedantou/p/5487531.html
Copyright © 2011-2022 走看看