1、通过top命令发现 cpu高的进程
根据top命令,发现PID 为22143的Java进程占用CPU 17.8%
2、根据cpu高的进程,查找引起cpu高的线程
命令:ps -mp 22143 -o THREAD,tid,time|sort -k1 -nr|head -15方案二:
top -H -p pid
这样是是看pid对应下的线程对应的的cpu 占用率,可以定位到cpu高的线程
这样是是看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在进行无阻塞运算等