有时会碰到Java进程莫名CPU占用率高的问题,如何分析定位问题?如果能定位到当前正在执行的代码就好了。既然有思路了,那就找工具吧:
1、查询Java进程信息
使用JDK自带的进程状态工具jps
jps -v
执行得到以下结果:
结果第一列30731为PID,第二列Bootstrap为main class(如想显示全名,用jps -v -l),后面为JVM参数。
2、找出引起性能问题的线程PID
top -H -p PID
假设第1个线程就是我们要找的线程(真实情况可以按CPU占用来排序查找),那线程PID就是31213。
3、导出Java进程的线程栈信息
jstack PID > output.txt
导出的文件包含PID对应的所有线程的栈信息。
4、定位问题线程
由于jstack导出的文件中,线程ID(jstack中用nid表示)以16进制表示,但top命令找出来的线程PID又是10进制,要先进行转换。
echo "obase=16;PID" | bc
将得到的结果复制到上一步的output.txt查找,即可定位到对应的线程栈。接下来就是分析java代码了,略去。