java程序开发阶段,我们都是在本地调试,基本不会出现cpu占用过高。
一旦程序部署到了线上,问题可能随着时间的推移,慢慢暴露,而且当你追查源码的时候,却无法复现。这时候很懊恼,其实我也一直很懊恼。面试的时候,还被问过这个问题,我说一般是通过jstack排查,面试官说还有没有别的办法,我没说上来,后来我问他,他们生产环境的排查使用什么办法,他也好像不是很懂,简单说了一个词语:火焰图。我后来还特意查了,没找到相关资料。
言归正传,jstack,确实可以定位cpu占用过高的问题。
大体步骤网上都给出了很多,大致如下:
1、top -c //定位Java进程。
2、top -Hp pid //获得该进程下占用时间最多的进程id。
3、printf "%x\n" tid //打印线程号对应的16进制表示,也可以通过其他方式计算。
4、jstack -l pid | grep hex(tid) -A 10 //过滤关键字之后10行的内容。
下面通过具体实验演示这个步骤。
我们不妨写一个故意让程序进入死循环的的程序:
public class Test{
public static void main(String args[]){
System.out.println("start.");
boolean flag = false;
while(!flag){
}
System.out.println("