1、首先通过topas监控可以看到当前占用CPU率较高的那个java进程,记录下进程号:1396916;
2、通过ps -mp 1396916 -o THREAD 以查找当前进程正在占用 CPU 的TID线程信息,把输出信息拷贝到文本文件中;注意查看“CP”列(表示 CPU 占用率),看其中哪些线程的此项值比较高并从中挑选出线程。
$ ps -mp 1396916 -o THREAD
USER PID PPID TID ST CP PRI SC WCHAN F TT BND COMMAND
waSUSEr 1396916 446514 - A 286 60 157 * 202001 - - /usr/was61/WebSphere/AppServer/java/bin/java -Declipse.
- - - 311297 R 63 124 0 - 400000 - - -
- - - 372769 S 0 82 1 f100070f10005b40 8410400 - - -
- - - 389319 S 0 60 1 f1000100101f15d8 410400 - - -
- - - 495815 S 0 82 1 f100070f10007940 8410400 - - -
- - - 524499 S 0 82 1 f100070f10008040 8410400 - - -
- - - 573567 S 0 82 1 f100070f10008c40 8410400 - - -
- - - 929945 S 0 82 1 f10002000715d0c8 400400 - - -
- - - 942239 S 0 82 1 f100070f1000e640 8410400 - - -
- - - 991485 S 11 89 1 f100070f1000f240 8410400 - - -
- - - 999521 S 0 70 1 f100070f1000f440 8410400 - - -
- - - 1048809 S 0 82 1 f100070f10010040 8410400 - - -
- - - 1061013 R 71 60 0 - 400000 - - -
- - - 1064987 S 0 82 1 f100070f10010440 8410400 - - -
- - - 1126635 S 0 82 1 f100070f10011340 8410400 - - -
- - - 1163499 S 0 82 1 f100070f10011c40 8410400 - - -
- - - 3166517 S 0 82 1 f100070f10830540 8410400 - - -
- - - 3285305 S 0 82 1 f100070f10832240 8410400 - - -
- - - 3428667 R 74 60 0 - 400000 - - -
- - - 3441043 Z 0 70 1 - c00001 - - -
- - - 3555589 S 0 82 1 f10002000bcab0c8 400400 - - -
- - - 3559823 S 0 82 1 f100070f10836540 8410400 - - -
- - - 3571987 S 0 82 1 f100070f10836840 8410400 - - -
3、通过kill -3 1396916 输出ThreadDump线程执行堆栈快照信息,在/usr/was61/WebSphere/AppServer/profiles/AppSrv01/temp目录中找到类似javacore.20130219.174013.1396916.0012.txt文件,拷贝到本地;
4、下面将PS中占用CPU率较高的这三个线程号311297、 1061013、 3428667分别转成16进制的数据(分别为4C001、103095、34513B),在JAVACORE文件中来对应查找并进行分析。
# printf "%X\n" 311297
4C001
# printf "%X\n" 1061013
103095
# printf "%X\n" 3428667
34513B
#注意%X(大写X代表16字母大写,AIX的javacore中是大写,Linux jstack是小写)
取4C001在javacore.20130219.174013.1396916.0012.txt中找到下面一段日志:
3XMTHREADINFO "WebContainer : 36" (TID:0x0000000117C92900, sys_thread_t:0x000000011AFD19B8, state:CW, native ID:0x000000000004C001) prio=5
4XESTACKTRACE at sun/awt/color/CMM.cmmColorConvert(Native Method)
4XESTACKTRACE at sun/awt/color/ICC_Transform.colorConvert(ICC_Transform.java:888(Compiled Code))
取103095在javacore.20130219.174013.1396916.0012.txt中找到下面一段日志:
3XMTHREADINFO "WebContainer : 35" (TID:0x0000000115FF2F00, sys_thread_t:0x0000000119F4DA58, state:CW, native ID:0x0000000000103095) prio=5
4XESTACKTRACE at sun/awt/color/CMM.cmmColorConvert(Native Method)
4XESTACKTRACE at sun/awt/color/ICC_Transform.colorConvert(ICC_Transform.java:888(Compiled Code))
取34513B在javacore.20130219.174013.1396916.0012.txt中找到下面一段日志:
3XMTHREADINFO "LT=3:P=496939:O=0:port=9812" (TID:0x0000000116087200, sys_thread_t:0x00000001159DF238, state:CW, native ID:0x000000000012202D) prio=5
java.net.SocketException: Too many open files
4XESTACKTRACE at java/net/PlainSocketImpl.socketAccept(Native Method)
4XESTACKTRACE at java/net/PlainSocketImpl.accept(PlainSocketImpl.java:457(Compiled Code))
通过上述跟踪的结果,判定前两段跟踪代码是与图片验证码的生成有关;后一段跟踪代码是与文件句柄有关。