java cpu问题排查

当 CPU 消耗严重时,主要体现在 us、sy、wa 或 hi 的值变高,wa 的值时 IO 等待造成的;hi 的值变高主要因为硬件中断造成的,例如网卡接受数据频繁的状况;
对于 Java 应用而言,CPU 消耗严重主要体现在 us、sy 两个值上。
当 us 值过高时,表示运行的应用消耗了大部分的 CPU,在这种情况下,对于 Java 应用而言,最重要的为找到具体消耗 CPU 的线程所执行的代码。

top 确定cpu占用最高的进程
  • 使用以下三种方法的其中一种,找到CPU使用率较高的线程TID,其中7为pid
1. top -H -p 7
2. ps -mp 7 -o THREAD,tid,time|sort -k2nr
3. ps H -eo pid,tid,%cpu --sort=%cpu |grep 7|sort -k3nr
计算java线程id的16进制值
printf "%x\n" 78
jstack [java进程pid] | grep [线程id十六进制值] -A 30
jstack 7 | grep xead -A 30
内存泄漏 触发频繁GC,导致cpu占用高
  • GC是Java的垃圾回收机制

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

jstat -gc 7
用命令dump 内存堆存储快照:
jmap -dump:format=b,file=/tmp/my.hprof [java进程id]
jmap -dump:format=b,file=/tmp/my.hprof 7
定位代码块
#使用jstack生成虚拟机当前时刻的线程快照:
jstack -l <pid> >> jstackLog.out

jstack -l 7 >> jstackLog.out
  • 目的:将当前堆栈信息保存为文件,通过16进制的TID查找问题所在的代码块,搜索得到对应的线程信息,可直观的看到代码异常信息。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值