解决过程:
1,根据top命令,发现PID为7137的Java进程占用CPU高达200%,出现故障。
2,找到该进程后,如何定位具体线程或代码呢,首先显示线程列表,并按照CPU占用高的线程排序:
显示结果如下:
[app100657741@qxtx-s20-246 ~]$ ps -mp 7137 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
25438 14.2 - - - - - - 00:02:23
25438 0.0 19 - futex_ - - 7137 00:00:00
25438 3.4 19 - futex_ - - 7138 00:00:34
或者
[app100657741@qxtx-s20-246 ~]$ top -H -p 7137
top - 13:24:41 up 17 min, ? users, load average: 0.15, 0.17, 0.10
Tasks: 68 total, 0 running, 68 sleeping, 0 stopped, 0 zombie
Cpu(s): 6.4%us, 0.8%sy, 0.0%ni, 91.2%id, 0.4%wa, 0.0%hi, 0.0%si, 1.2%st
Mem: 4051060k total, 2523676k used, 1527384k free, 7060k buffers
Swap: 2097144k total, 0k used, 2097144k free, 145776k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7220 app10065 20 0 4780m 2.0g 12m S 2.0 52.1 0:05.53 java
7224 app10065 20 0 4780m 2.0g 12m S 2.0 52.1 0:05.24 java
找到了耗时最高的线程,占用CPU最大的!
将需要的线程ID转换为16进制格式:
[root@localhost logs]# printf "%x\n" 7220
1c34
最后打印线程的堆栈信息:
[root@localhost logs]# jstack 2633 |grep 1c34 -A 30
[root@localhost logs]#jstat -gcutil 5342 1000 300 #可以显示gc的信息,查看gc的次数,及时间 [root@localhost logs]#jmap -histo 5342 #打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 [root@localhost logs]# jmap -dump:format=b,file=gamexdds1.dump 15370 #dump内存
转载于:https://blog.51cto.com/dingmh/1357980