使用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 start2,使用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)
本文详细介绍了如何使用jstack工具来分析java程序中CPU占用率过高的线程问题,包括如何在Linux环境下找出相关进程,使用top-p命令观察线程CPU占用情况,以及如何通过jstack命令获取特定线程的状态信息。通过分析线程状态,开发者能够定位到导致高CPU占用的原因,并采取相应措施进行优化。
966

被折叠的 条评论
为什么被折叠?



