top -Hp pid
printf "%x\n" 21742 找到耗时最长的进程
jstack pid | grep 54ee 定位某个类的方法
jstack 10535|grep -A 10 2a1d (最后十行)
jmap 查询pid 内存线程
附:TOP命令中需要关注的值:
(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在进行无阻塞运算等
"consumer_pt_parser_realtime_001_jmq318_1464086436552" daemon prio=10 tid=0x00007fa4a0009000 nid=0x2a1d runnable [0x00007fa568fac000]
java.lang.Thread.State: RUNNABLE
at java.util.Arrays.copyOfRange(Arrays.java:2694)
at java.lang.String.<init>(String.java:203)
at java.lang.String.substring(String.java:1913)
at com.jdjr.crawler.clean.parser.defaultparser.DefaultParserFactory.countBiaoShi(DefaultParserFactory.java:276)
at com.jdjr.crawler.clean.parser.defaultparser.DefaultParserFactory.getReContent(DefaultParserFactory.java:194)
at com.jdjr.crawler.clean.parser.defaultparser.DefaultParserFactory.parseAriticle(DefaultParserFactory.java:57)
at com.jdjr.crawler.clean.parser.control.ParserMessageListener.consume(ParserMessageListener.java:115)
at com.jdjr
.crawler.clean.parser.control.ParserMessageListener.onMessage(ParserMessageListener.java:71)
at com.jd.jmq.client.consumer.TopicConsumer$1.call(TopicConsumer.java:767)
注:
1,根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。
2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
[root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn
显示结果如下:
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 10.5 19 - - - - 3626 00:12:48
root 10.1 19 - - - - 3593 00:12:16
找到了耗时最高的线程3626,占用CPU时间有12分钟了!
将需要的线程ID转换为16进制格式:
[root@localhost logs]# printf "%x\n" 3626
e18
最后打印线程的堆栈信息:
[root@localhost logs]# jstack 2633 |grep e18 -A 30
查看死锁
jstack -l 7412
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
已有 0 人发表留言,猛击->> 这里<<-参与讨论
ITeye推荐