一、使用top查找出最耗cpu的进程号(PID)
(提示:可以按shift+p来按cpu排序。) 这里我们看到最耗cpu的进程是:17315
二、使用jstack dump对应PID的堆栈信息保存备查
这没什么好说的。有时候需要加-F (强制选项)。另外,在jdk1.6.0.23之前,有一个bug。无法用这种方法dump下详细的堆栈信息。只有线程号。 dump下来的文件内容大概长这样:几个比较有用的信息包括 线程名称、nid(native id, 一会儿会用到)、线程状态
三、再次使用top查出对应PID中最耗cpu的子进程(java线程)
top命令使用-p参数来指定进程号,-H参数来显示线程。这里可以看到最耗cpu的进程(java中的线程)是17316
四、从dump下来的堆栈信息中查找耗费性能的代码块
从上面开到,我们用top找出来的pid是十进制的。而dump下来的nid是十六进制的。其实他们是一个东西。只是进制不同。于是我们利用printf命令格式化来转换一下进制(当然,也可以用其他方式): 通过在vim中查找,就能找到问题所在了。 :D
好了,基本就是这样一个步骤,对于分析线上问题还是有一定帮助的。have fun!