利用jstack分析JAVA应用CPU占用过高的问题

来源:互联网 发布:淘宝app怎么改评价 编辑:程序博客网 时间:2024/04/29 02:40
使用jstack分析java程序cpu占用率过高的有关问题

1,先在linux下用ps -ef | grep java 找出java进程的pid,如14874

ps -ef | grep javaroot     14874     1  6 15:20 ?        00:04:55 ./jdk1.6.0_31/jre/bin/java -Djava.util.logging.config.file=/ucm/apache-tomcat-6.0.28/conf/logging.properties -Xms512m -Xmx8196m -XX:PermSize=64M -XX:MaxPermSize=256m -Djava.awt.headless=true -Duser.timezone=GMT+8-Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 -server -Xms512m -Xmx1600m -XX:MaxPermSize=256m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9005 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8788 -Djava.endorsed.dirs=/ucm/apache-tomcat-6.0.28/endorsed -classpath /ucm/apache-tomcat-6.0.28/bin/bootstrap.jar -Dcatalina.base=/ucm/apache-tomcat-6.0.28 -Dcatalina.home=/ucm/apache-tomcat-6.0.28 -Djava.io.tmpdir=/ucm/apache-tomcat-6.0.28/temp org.apache.catalina.startup.Bootstrap start


2,使用top -p 14874-H观察该进程中所有线程的CPU占用。

[root@UC100C ~]# top -p 14874-Htop - 16:45:53 up 7 days, 23:20, 12 users,  load average: 50.85, 42.35, 22.56Tasks: 334 total,  19 running, 315 sleeping,   0 stopped,   0 zombieCpu(s): 80.1%us, 16.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  3.9%si,  0.0%stMem:   3889304k total,  3108580k used,   780724k free,   143980k buffersSwap:  4046840k total,  1485836k used,  2561004k free,   356796k cached  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                              17262 root      20   0 3511m 1.3g  10m R  2.3 34.2   0:10.07 java                                                                                                                  17324 root      20   0 3511m 1.3g  10m S  2.3 34.2   0:10.67 java                                                                                                                  17343 root      20   0 3511m 1.3g  10m S  2.3 34.2   0:09.61 java                                                                                                                  17361 root      20   0 3511m 1.3g  10m R  2.3 34.2   0:10.34 java                                                                                                                  17363 root      20   0 3511m 1.3g  10m S  2.3 34.2   0:10.36 java                                                                                                                  17396 root      20   0 3511m 1.3g  10m S  2.3 34.2   0:10.32 java                                                                                                                  17407 root      20   0 3511m 1.3g  10m R  2.3 34.2   0:10.03 java                                                                                                                  15236 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:09.52 java                                                                                                                  15237 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.65 java                                                                                                                  15238 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:10.90 java                                                                                                                  17258 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.41 java                                                                                                                  17259 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.48 java                                                                                                                  17260 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.43 java                                                                                                                  17261 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.53 java                                                                                                                  17263 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.49 java                                                                                                                  17326 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:10.00 java                                                                                                                  17360 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:11.30 java                                                                                                                  17362 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:10.85 java                                                                                                                  17364 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:11.38 java                                                                                                                  17365 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:09.73 java                                                                                                                  17366 root      20   0 3511m 1.3g  10m S  2.0 34.2   0:09.43 java                                                                                                                  17381 root      20   0 3511m 1.3g  10m R  2.0 34.2   0:09.45 java  



3,找出CPU消耗较多的线程id,如17262,将17262转换为16进制0x436E。

4,有配置java运行环境直接使用jstack14874|grep -A 10 0x436E来查询出具体的线程状态。jstack 14874|grep -A 10 0x436E来查询出具体的线程状态 当然有时候转换没有这么快,可以运行jstack 14874 > test  来将整个内存快照保存起来,然后再打开用0X436E 查询。

"pool-2-thread-10" prio=10 tid=0x00007f9764038800 nid=0x436e runnable [0x00007f973c542000]   java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:129)at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)- locked <0x00000000a19f0fd0> (a com.mysql.jdbc.util.ReadAheadInputStream)


通过这些线程状态便可基本定位问题之所在。
0 0
原创粉丝点击