1.使用top命令

然后按住shift+C按照cpu占用比例排序展示,找到占用cpu最高的程序pid为 24062
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24062 root 20 0 18.3g 924496 14500 S 99.0 11.5 0:00.01 java
24063 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:22.24 java
24064 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.51 java
24065 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.46 java
24066 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.61 java
24067 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.54 java
24068 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.53 java
24069 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.54 java
24070 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.64 java
24071 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.67 java
24072 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.57 java
24073 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.56 java
24074 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.56 java
24075 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.62 java
24076 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.57 java
24077 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.60 java
24078 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.60 java
24079 root 20 0 18.3g 924496 14500 S 0.0 11.5 0:08.57 java

2.使用jstack将进程的快照dump到本地

$ jstack -l 24062 > /tmp/jstack.log

3.查看进程24062下 子进程的cpu占用情况,查看哪些子进程占用cpu比较高 24214

$ top -H -p 24062
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24214 root 20 0 18.3g 924508 14500 S 90.0 11.5 8:02.91 java
24062 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:00.01 java
24063 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:22.24 java
24064 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.51 java
24065 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.46 java
24066 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.61 java
24067 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.54 java
24068 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.53 java
24069 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.54 java
24070 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.64 java
24071 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.67 java
24072 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.57 java
24073 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.56 java
24074 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.56 java
24075 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.62 java
24076 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.57 java
24077 root 20 0 18.3g 924508 14500 S 0.0 11.5 0:08.60 java

4.将24214转为16进制

$ echo 24214 | awk '{printf("%xn",$0)}'
5e96

5.在jstack.log中搜索查找5e96

可以定位到线程和相应的代码位置行数

比较可能出现的问题:

1.有个复杂对象没有使用单例模式生成,频繁生成导致cpu使用率很高
2.有内存泄露,频繁gc导致。如创建线程没有回收