-
top命令分析进程的CPU使用率
执行top -c ,显示进程运行信息列表,可以看到每个进程的CPU使用率
键入大写P,让进程根据CPU使用率从大到小排序。
clipboard.png -
top -Hp找到最耗CPU的线程
top -Hp 40193,显示一个进程的线程运行信息列表,键入大写p,使线程按照CPU使用率排序从大到小排序
图示:
clipboard1.png
如上图,进程40193内,最耗CPU的线程PID为40217
或者:
使用jps 通过pId查询到程序的名称
ps -mp pId -o Thread,tid,time 获取线程ID
-
将线程PID转化为16进制,之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。
图示:
printf “%x\n” 40217
clipboard2.png
如上图,40217对应的16进制是0x9d19,
4:查看线程的堆栈信息,看看是什么原因引起的CPU使用率过高
工具:pstack/jstack/grep
方法:jstack 40193 | grep 0x9d19 --color -C 200
打印进程堆栈,堆栈信息举例:
"pool-26-thread-6" #1441 prio=5 os_prio=0 tid=0x00007f7368058800 nid=0x3b4f5 runnable [0x00007f7234fb2000]
java.lang.Thread.State: RUNNABLE
at java.lang.Throwable.getStackTraceElement(Native Method)
at java.lang.Throwable.getOurStackTrace(Throwable.java:827)
- locked <0x0000000084fcb808> (a java.lang.Exception)
at java.lang.Throwable.getStackTrace(Throwable.java:816)
at java.lang.Thread.getStackTrace(Thread.java:1552)
at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1014)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:940)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:930)
at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102)
...
省略
...
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)