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

   在项目中经常会碰到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占用率;

 

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

    ps -mp PID -o THREAD,tid,time

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

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

   printf "%x " tid

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

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

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

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

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

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

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

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

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

另:jmap -dump:live,format=b,file=XXX.bin pid

       jmap -heap pid

       jmap -histo:live pid

原文地址:https://www.cnblogs.com/moonandstar08/p/4893084.html