JVM调优之jstack找出最耗cpu的线程并定位代码
在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况。这种情况发生时,我们怎么去找出原因并解决。
我这里使用top +jstack命令去查找cpu占用比较高的代码。
操作如下:
1.top查看java项目中占用吃cpu比较高的进程。
ps -ef|grep weblogic |grep -v grep oracle 14740 14652 9 00:00 ? 00:59:06 /usr/java/jdk1.7.0_55/bin/java -server -Xms2048m -Xmx4096m -XX:MaxPermSize=1024m -Dweblogic.Name=AdminServer ---------
2.使用top -Hp 查看线程占用情况
top -Hp 14740 top - 10:13:59 up 314 days, 21:07, 1 user, load average: 0.25, 0.38, 0.44 Tasks: 198 total, 0 running, 198 sleeping, 0 stopped, 0 zombie Cpu(s): 4.0%us, 1.5%sy, 0.0%ni, 94.1%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st Mem: 8174516k total, 8077956k used, 96560k free, 167104k buffers Swap: 20482864k total, 121696k used, 20361168k free, 3805988k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16627 oracle 15 0 6036m 3.2g 47m S 0.7 41.3 4:52.08 java 14740 oracle 18 0 6036m 3.2g 47m S 0.0 41.3 0:00.00 java 14741 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:08.38 java 14742 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:42.64 java 14743 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:42.64 java 14744 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:43.50 java 14745 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:00.37 java 14746 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:04.70 java 14747 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:00.00 java 14748 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 1:24.94 java 14749 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 1:23.13 java 14750 oracle 18 0 6036m 3.2g 47m S 0.0 41.3 0:00.00 java 14751 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:00.18 java 14940 oracle 15 0 6036m 3.2g 47m S 0.0 41.3 0:00.28 java
3.TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为16627的线程,用
printf "%x\n" 16627
得到21742的十六进制值为40f3。
下面就使用jstack定位这个线程的代码。
jstack -F 14740 | grep -A 20 40f3 Attaching to process ID 14741, please wait... Debugger attached successfully. Server compiler detected. JVM version is 24.55-b03 java.lang.NullPointerException at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:78) at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45) at sun.jvm.hotspot.tools.JStack.run(JStack.java:60) at sun.jvm.hotspot.tools.Tool.start(Tool.java:221) at sun.jvm.hotspot.tools.JStack.main(JStack.java:86) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at sun.tools.jstack.JStack.runJStackTool(JStack.java:136) at sun.tools.jstack.JStack.main(JStack.java:102)
通过上面这段代码可以找出什么原因导致java进程占用那么高CPU资源。
注:有的时候jstack这个命令找不到,可以用locate jstack查找具体路径。如果还没有,那就要确定这个项目是不是java项目了。
嗨、骚年、快来消灭0回复。