使用jstack分析java程序cpu占用率过高

时间:2023-03-08 16:05:38

在项目中经常会碰到CPU占用率过高的问题,那么碰到这类问题应当如何处理呢?下面提供一种处理思路:

首先top -H -p <pid>以线程的模式查看java应用的运行情况,找到占用cpu或者内存大的线程,记录线程id,然后printf %x <tid>转为16进制,再jstack -l <pid> > thread.log把java进程的thread dump出来,从里面找到tid,分析是哪个线程占用了系统资源。具体操作步骤如下:

1、使用TOP查看所用CPU占用率,查找出Java进程的PID,如3707;

2、使用top -p 14292 -H观察该进程中所有线程的CPU占用率;

使用jstack分析java程序cpu占用率过高

3、通过ps查看当前CPU高的进程所使用的线程;

ps -mp PID -o THREAD,tid,time

示例:ps -mp 15844 -o THREAD,tid,time

4、通过第三步获取线程号之后,将CPU最高的tid转换为16进制,转换命令如下:

printf "%x\n" tid

示例如14292,将14292转换为16进制0x3de4,注意是小写; 
5、使用jstack 15844|grep -A 10 0x3de4来查询出具体的线程状态;

jstack PID|grep tid的16进制 -A 30

使用jstack分析java程序cpu占用率过高

5、在 Thread dump 中,用转换为十六进制的线程 id 查找相应线程的调用信息。该 id 应该出现在 Thread dump 的 nid 中。

通过这些线程状态便可基本定位问题之所在

另上:JDK常见命令的处理可以参见ttp://qifuguang.me/categories/工具使用/

http://blog.****.net/jiangguilong2000/article/details/17971247

http://www.yangguo.info/2015/04/01/线程转储/

http://blog.****.net/liweisnake/article/details/8470285

性能分析案例请参见:http://hellojava.info/