java-jvm-cpu (cpu)高问题排查

1、通过top命令发现 cpu高的进程

根据top命令,发现PID  为22143的Java进程占用CPU 17.8%
java-jvm-cpu (cpu)高问题排查_第1张图片

2、根据cpu高的进程,查找引起cpu高的线程

命令:ps -mp 22143 -o THREAD,tid,time|sort -k1 -nr|head -15

java-jvm-cpu (cpu)高问题排查_第2张图片
方案二:
 top -H -p pid 
java-jvm-cpu (cpu)高问题排查_第3张图片
这样是是看pid对应下的线程对应的的cpu 占用率,可以定位到cpu高的线程 
(这个图是后补的)

3、收集进程的堆栈信息上下文

jstack -F pid >data.txt 即可把线程的堆栈信息统计到 文件中

 

注意:jstack -F 这个 -F参数,最好不加,因为加上-F打印的线程挂起的栈信息

4、根据线程id定位代码

查找22328 线程对应的线程:

 

 

注意:不是每次jstack 都能拿到cpu 高的线程,我试验的时候,不是每次都能的。

 

如果没有加  -F 参数,输出的如下:

可以通过

echo "ibase=10;obase=16;22328"|bc

 

输出:0x5738

 

"main" prio=10 tid=0x00007f52fc008800 nid=0x5738 waiting for monitor entry [0x00007f53032b1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at Test.main(Test.java:26)
        - waiting to lock <0x00000000eb64c2d8> (a java.util.HashMap)
 

 

 

参考:http://www.blogjava.net/hankchen/archive/2012/05/09/377735.html

 

 

 

(1)load average:此值反映了任务队列的平均长度;如果此值超过了CPU数量,则表示当前CPU数量不足以处理任务,负载过高
(2)%us:用户CPU时间百分比;如果此值过高,可能是代码中存在死循环、或是频繁GC等
(3)%sy:系统CPU时间百分比;如果此值过高,可能是系统线程竞争激烈,上下文切换过多,应当减少线程数
(4)%wa:等待输入、输出CPU时间百分比;如果此值过高,说明系统IO速度过慢,CPU大部分时间都在等待IO完成
(5)%hi:硬件中断CPU百分比;当硬件中断发生时,CPU会优先去处理硬件中断;比如,网卡接收数据会产生硬件中断
(6)swap used:被使用的swap;此值过高代表系统因为内存不足在进行频繁的换入、换出操作,这样会影响效率,应增大内存量
(7)%CPU:进程使用CPU的百分比;此值高表示CPU在进行无阻塞运算等

你可能感兴趣的:(java-jvm&性能&原理)