Linux中查找最耗性能的JAVA代码

时间:2023-03-09 18:51:31
Linux中查找最耗性能的JAVA代码

在这里总结一下查找Linux、Java环境下最耗CPU性能的代码段的方法。基本上原理就是使用top命令查看最耗cpu的进程和线程(子进程)。使用jstack把java线程堆栈给dump下来。然后,在堆栈信息中查找出对应的代码块。具体操作如下:

一、查找最耗cpu的进程

执行:top
输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 3320m 689m 10m S 120.5 8.8 : java
root 2694m 21m S 11.1 0.3 :28.65 java
root 2694m 21m S 6.9 0.3 :18.50 java
root 2004m 389m 15m S 1.4 4.9 :47.65 java
root R 1.4 0.0 :00.01 top
root S 0.0 0.0 :02.50 init
root S 0.0 0.0 :00.00 kthreadd
root RT S 0.0 0.0 :00.02 migration/
root S 0.0 0.0 :01.16 ksoftirqd/
root RT S 0.0 0.0 :00.00 watchdog/

这里我们看到最耗cpu的Java进程是:12789

二、jstack堆栈信息保存

进入Java的安装目录(如:/usr/java/jdk1.6.0_34/bin),在bin文件夹中执行:./jstack 12789  >  jstackResult.txt 这样,就将堆栈信息保存到jstackResult.txt这个文件中了。jstackResult.txt中的内容大体如下:

Linux中查找最耗性能的JAVA代码

三、查出最耗cpu的子进程(java线程)

执行:top -p  –H
输出:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 3320m 689m 10m S 13.7 8.8 :57.24 java
root 3320m 689m 10m R 2.7 8.8 :57.68 java
root 3320m 689m 10m S 2.7 8.8 :49.73 java
root 3320m 689m 10m S 2.3 8.8 :55.86 java
root 3320m 689m 10m S 2.3 8.8 :50.22 java
root 3320m 689m 10m R 2.3 8.8 :37.94 java
root 3320m 689m 10m R 2.3 8.8 :17.72 java
root 3320m 689m 10m R 2.3 8.8 :18.59 java
root 3320m 689m 10m S 2.3 8.8 :00.05 java
root 3320m 689m 10m S 2.0 8.8 :07.45 java
root 3320m 689m 10m S 2.0 8.8 :12.15 java
root 3320m 689m 10m S 2.0 8.8 :11.94 java
root 3320m 689m 10m R 2.0 8.8 :00.50 java
root 3320m 689m 10m R 2.0 8.8 :24.82 java
root 3320m 689m 10m R 2.0 8.8 :27.09 java
root 3320m 689m 10m R 2.0 8.8 :19.02 java
root 3320m 689m 10m R 2.0 8.8 :40.06 java

找到12789下最耗性能的子进程。top命令使用-p参数来指定进程号,-H参数来显示线程。这里可以看到最耗cpu的进程(java中的线程)是11637。

四、从堆栈信息中查找最耗费性能的代码块

从上面看到,我们用top找出来的pid是十进制的。而dump下来的nid是十六进制的。其实他们是一个东西,只是进制不同。利用printf命令格式化来转换一下进制。

执行:printf %0x
输出:2d99

通过在dump出的堆栈信息中查找,就能找到问题所在了。

Linux中查找最耗性能的JAVA代码