问题:

公司参加HW期间,项目两台双活的jboss服务器频繁触发cpu利用率过高告警,cpu利用率长时间在90%以上。

排查思路:

第一步:在两台Linux服务器上,执行top命令,并按大写P以cpu利用率排序,确定cpu占用最高的进程为 java进程

那么,java进程cpu占用过高该如何排查呢,我们从两个角度出发:

(1)执行任务的java线程本身存在bug,死循环或者操作本身耗cpu,导致cpu占用过高

(2)jvm发生频繁gc,导致cpu过高

第二步:先排查java任务线程本身,确定什么线程cpu占用过高

(1)方法一:ps -mp [java进程id] -o THREAD,tid,time | sort -n   找到cpu占用最大的线程id

注意,该方法在生产环境测试,发现无法找到cpu占用高的线程,显示所有线程cpu占用均为0,因此实际排查采用方法二

(2)使用top -H -p [java进程id],找到cpu占用较高的线程id,如下图所示,左边红框标注的PID列为线程id

第三步:计算java线程id的16进制值,因为后续用jstack看到的线程快照中,线程id为小写十六进制值

(1)可百度在线进制转换

(2)可使用windows自带的计算器,程序员模式,可转换十六进制

(3)Linux可使用命令:printf "%x\n" [线程_id]

第四步:使用命令 jstack [java进程pid] | grep [线程id十六进制值] -A 30(-A 30表示向下打印30行)

分析上图可知,线程在做正则匹配,查看完整堆栈可定位到具体代码位置,分析后,确定在做url的正则匹配。继续分析其他线程,发现基本都在做url正则匹配。

后续分析,则需要结合业务代码分析,正则匹配是否耗时。

正则分析参考博客:https://blog.csdn.net/weixin_33023873/article/details/114740786

第五步:从gc角度出发,是否存在大量gc,首先确定当前内存消耗情况,使用top命令或者查看设备监控管理系统,确定内存利用率达97%:

第六步:确认gc次数,使用命令 jstat -gc [java进程ID]:

YGC,表示 Young GC,也就是Minor GC,发生在新生代中的GC

FGC,表示 Full GC,发生在老年代中的GC

S0C:第一个幸存区的大小
S1C:第二个幸存区的大小
S0U:第一个幸存区的使用大小
S1U:第二个幸存区的使用大小
EC:伊甸园区的大小
EU:伊甸园区的使用大小
OC:老年代大小
OU:老年代使用大小
MC:方法区大小
MU:方法区使用大小
CCSC:压缩类空间大小
CCSU:压缩类空间使用大小
YGCT:年轻代垃圾回收消耗时间
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间 

如何计算gc频率,参考:https://blog.csdn.net/qq_18671415/article/details/104446568

结合上图可知,程序运行以来共发生7436次YGC,63次FGC,gc次数较多

基本可以说明存在频繁GC导致cpu占用高的问题

第七步:使用命令dump 内存堆存储快照:jmap -dump:format=b,file=/tmp/my.hprof [java进程id]

第八步:使用内存分析工具,如Eclipse Memory Analyzer等分析my.hprof文件,分析内存那块占用大,存在内存泄露,导致空间无法释放。

总结:

cpu利用率过高排查,需要从两个角度排查,一是自身任务线程是否存在bug,二是是否内存泄露导致触发频繁gc;然后利用top、jstack、jmap等工具,定位出问题的代码位置,然后针对性分析修改。

java进程cpu占用高如何排查相关推荐

  1. java进程CPU占用高如何排查-案例二

    近期项目新版本上线遇到cpu冲高现象,依据之前的经验,把这次排查过程记录下. 这次排查参考了之前记录的经验,还是很有用的:java进程cpu占用高如何排查_停5s的博客-CSDN博客_java进程cp ...

  2. Java进程CPU占用高导致的网页请求超时的故障排查

    作者:荣书 来源:https://blog.51cto.com/rongshu/2426712 一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load a ...

  3. Python应用CPU占用高问题排查

    Python应用CPU占用高问题排查 http://t.zoukankan.com/honglingjin-p-15159199.html公司购买了一套由外部供应商提供的呼叫中心系统,在使用的过程中发 ...

  4. mc java 连接超时_Java进程CPU占用高导致的网页请求超时的故障排查

    一.发现问题的系统检查: 一个管理平台门户网页进统计页面提示请求超时,随进服务器操作系统检查load average超过4负载很大,PID为7163的进程占用到了800%多.  二.定位故障 根据这 ...

  5. java 进程 cpu占用_JAVA进程CPU占用高的故障排查 – 运维那些事

    问题分析: 1.程序属于CPU密集型,和开发沟通过,排除此类情况. 2.程序代码有问题,出现死循环,可能性极大. 解决过程: 1.根据top命令,发现PID为2633的Java进程占用CPU高达300 ...

  6. Linux java进程CPU占用过高解决方案

    总目录 一.前言: 二.模拟java程序CPU过高 1 修改代码为死循环 2 部署在linux上 访问该接口 根据top命令查看CPU参数 3 通过ps命令查看这个程序的线程信息,tid代码线程ID, ...

  7. Java进程CPU使用率高排查

    1.使用top 定位到占用CPU高的进程PID top 通过ps aux | grep PID命令 2.获取线程信息,并找到占用CPU高的线程 ps -mp pid -o THREAD,tid,tim ...

  8. oracle rdbms 占CPU,求助,数据库某个进程cpu占用高

    客户管理员反映数据库cpu占用占用,查看后发现有个进程cpu占用特别高,有一条sql似乎进入了死循环,hanganalyzis分析文件: Trace file /oracle/diag/rdbms/o ...

  9. 使用dlv分析golang进程cpu占用高问题

    c++通过dbg分析内存和cpu,可能大家都会.本篇主要分析通过delve分析golang程序cpu占用高的问题. delve是golang推荐的专门go语言调试工具,用来替代gdb.golang组织 ...

最新文章

  1. Python 实现自动化批量重打包Android Apps
  2. R语言tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票月收益率数据条形图
  3. PHP 梯形图,学习PLC,不要先翻资料,干就完了.搞起你的第一个梯形图.
  4. OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
  5. CentOS 6升级默认python版本
  6. scikit-learn和tensorflow的区别
  7. qq音乐的歌词接口中例如#58,#46的特殊符号编码使用js进行转义
  8. 机器学习基石 作业二
  9. POJ 3376 Finding Palindromes
  10. 大学几年一直在“半瓶哐镗”的我
  11. pycharm清华镜像源使用
  12. VMWare ESXi上传iso镜像文件
  13. 哈利波特魔法觉醒游戏攻略分析
  14. 由OSS AccessKey泄露引发的思考
  15. Synopsys Formality 2018操作流程
  16. 打造原生的图文混排控件
  17. NOIP复习篇———动态规划
  18. lcs算法c语言代码,动态规划算法-LCS
  19. 网络三.网络传输设备:集线器,交换机,路由器
  20. el-select下拉框不同证件类型校验思路

热门文章

  1. 从个人习惯到真正的好方法
  2. 敏捷,路在何方?最新完整敏捷状态报告(专业点评版)出炉
  3. [深圳]盛情邀请1月25日下午嵌入式技术培训
  4. 快速学习-Windows常见CMD快捷指令
  5. 【Java 总结思考】Java 答疑解惑之基础篇
  6. 《连接数据库的天龙八部》
  7. Fedora17亮度调节,双显卡用户切换,无线网卡
  8. 2020年中小企业如何快速搭建网站?
  9. C++ freopen简单应用
  10. 神经营销:善用大脑科学做营销