写在前面:当你的java项目总是出现CPU占用很高的情况(服务器性能极弱除外),很可能因为某段代码出现死锁之类的BUG而导致CPU占用高甚至敲命令都卡顿!在日志无法具体指向的时候,你根本无法确定哪个地方出现了BUG,从而你也没法去解决。下面,就介绍一个抓取高占用CPU的线程的简单方法:

1.运行top命令取得JAVA线程号(PID),假如是2068;
2.运行jstack + pid 命令导出JAVA线程信息到result文件,命令行为
3.jstack 2068>result
4.运行top -p 2068 -H 查看CPU占用排名情况,并记录PID;
5.运行 ./jtgrep +PID 找到线程头文字(PID为第3步获取) ;
6.使用vi/vim打开result,查询头文字就能找到相应线程。

下面为jtgrep代码:

#bin/bash   
nid =`python -c "print hex($1)"` grep -i $nid $2

写在后面:此方法无须安装任何软件,能够快速找出占用CPU的JAVA线程,是发现同类问题的首选办法,但很多时候你可能找到的是VM threads线程或者GC线程。。。无法真正找到毒瘤,那就只能另寻他法了。