入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

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

创建时间:2014-02-22 投稿人: 浏览次数:2311
使用jstack分析java程序cpu占用率过高的有关问题

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

ps -ef | grep java
root     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-H
top - 16:45:53 up 7 days, 23:20, 12 users,  load average: 50.85, 42.35, 22.56
Tasks: 334 total,  19 running, 315 sleeping,   0 stopped,   0 zombie
Cpu(s): 80.1%us, 16.1%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  3.9%si,  0.0%st
Mem:   3889304k total,  3108580k used,   780724k free,   143980k buffers
Swap:  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运行环境直接使用jstack 14874|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: RUNNABLE
	at 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)


通过这些线程状态便可基本定位问题之所在。
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
  • 上一篇:没有了
  • 下一篇:没有了
未上传头像