Solaris
51Testing软件测试网?1X7c9cC*VZuIJRjIV$|4p
v0在
Java 进程中运行 prstat命令。重复几次这个操作,以便您能够看到一种模式。例如:prstat -L -p <PID> 1 1
51Testing软件测试网D:k7c%q^4ZmR在 Java 进程中运行 pstack命令以获得从轻量型进程 (LWP) 到 PID(进程 ID)的映射。
Ofl\!~8`0示例:pstack 9499 并将输出结果重定向到一个文件。
51Testing软件测试网
v6_$Bb*u m#K:dn如果您使用 Solaris 中的常规线程库(即,在 LD_LIBRARY_PATH 中没有 /usr/lib/lwp),LWP 就不会直接映射到
操作系统线程,因此您必须从进程中执行 pstack(所以检查看您是否正在使用替代线程库)。
51Testing软件测试网"md"e3y~经过一段时间后对服务器进行若干 Thread Dump,确保您执行正确的线程。
vV w8J-VA
w0您可以通过在 Java 进程中执行 kill -3 <PID>来达到此目的。
v/RS,Z'|;I,a'b4w5m,l&?0将 LWP ID 映射到 Java 线程 ID。
51Testing软件测试网8w)]%m9d'Y{X ?y4r8Y例如,如果上述的 LWP 为“8”,它可以映射到 Java 线程“76”。然后将 76 换算为十六进制值 0x4c。
%q6Y)O9A*s$b0检查 Thread Dump,找到匹配“nid= <上述标识符/值>”的线程。
51Testing软件测试网ER-B"O9[+O在本示例中,您找到匹配“nid=0x4c”的线程,而该线程就是正在消耗 CPU 资源的那个线程。
51Testing软件测试网d.K~0N\)HS(d您将需要:
lq5ymd#k0确定为什么在您的代码中会发生这个问题
51Testing软件测试网vPf9M+uj9E51Testing软件测试网,`pF}k3mq)?*d或者,如果堆栈的最顶端输出来自 WebLogic,请与 BEA 客户支持部门联系。
y2ZO+E1C.P#HNY$o0下面是 Solaris 系统中上述进程的一个示例:
~`(T
ca8Y/z0在 Java 进程中运行 prstat 命令。
sm
o:fx3u+R V+u051Testing软件测试网3|Ueto5Uh$ prstat -L -p 9499 1 1
%n)adh |{m4K&c0PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/LWPID
N|,m$]K7h-O*d(h0?09499 usera 153M 100M sleep 58 0 0:00.22 0.6% java/8
aL4J'u"x09499 usera 153M 100M sleep 58 0 0:00.10 0.2% java/1051Testing软件测试网5{q.HAZ
9499 usera 153M 100M sleep 58 0 0:00.11 0.1% java/9
GLyZw S ANz09499 usera 153M 100M sleep 58 0 0:00.03 0.0% java/551Testing软件测试网NQZlm c%Yu
9499 usera 153M 100M sleep 58 0 0:01.01 0.0% java/1
8K.P8c?H2wko09499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/12
5_+wHa@z*_R0eo09499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/1151Testing软件测试网f-EP5lT6BE+L
^
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/14
!u8iJSE1N3zv09499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/1351Testing软件测试网i@I+r,S#\/T J{E
9499 usera 153M 100M sleep 59 0 0:00.07 0.0% java/751Testing软件测试网'{A\'T-?%?h\3c
9499 usera 153M 100M sleep 59 0 0:00.00 0.0% java/6
x_-x|5?*ju09499 usera 153M 100M sleep 59 0 0:00.00 0.0% java/451Testing软件测试网b_%B2|
m(k O0tK7|
9499 usera 153M 100M sleep 58 0 0:00.11 0.0% java/351Testing软件测试网$m%y\{/MEm
9499 usera 153M 100M sleep 58 0 0:00.00 0.0% java/2
BQ&I9Qs&]'M6D0
I1K/|8lciaC0运行 pstack 命令。
I M/\+iRjB!E;x0示例:pstack 9499 并将输出结果重定向到一个文件。
-hF&F&|1R(P_0如果您使用 Solaris 中的常规线程库(即,在 LD_LIBRARY_PATH 中没有 /usr/lib/lwp),LWP 就不会直接映射到操作系统线程,因此您必须从进程中执行 pstack(所以检查看您是否正在使用替代线程库)。51Testing软件测试网p
UH
~"VG5YA0m
X
I*Jpc7SQ+G9d
mi0上述示例显示“java/8”进程在 prstat 的顶端。51Testing软件测试网rk)T)X){t4n
4K(i3XY+fb#e2|Mo-S0为“lwp# 8”检验 pstack输出结果。51Testing软件测试网0tLB3`xf(b
您会发现“lwp# 8”从 pstack 输出结果映射到“thread# 76”,如下所示。
lwp# 8 / thread# 76
ff29d190 poll (e2e81548, 0, bb8)
51Testing软件测试网c
}6ig P"]1a`ff24d154 select (0, 0, 0, e2e81548, ff2bf1b4, e2e81548) + 348
_%Mt'R
f,kI0ff36b134 select (0, bb8, 7fffffff, fe4c8000, 0, bb8) + 34
51Testing软件测试网/{!ro.E9yb-sfe0f62e4 __1cCosFsleep6FpnGThread_xl_i_ (0, bb8, fe4c8000, 1, 0, 1e2fd8) + 234
51Testing软件测试网3~]?}yFUfe23f050 JVM_Sleep (2, 0, bb8, fe4de978, fe4c8000, 1e2fd8) + 22c
51Testing软件测试网#T+K,V)l%p/eo+M0008f7ac ???????? (e2e818d4, bb8, 1e2fd8, 984a4, 0, 109a0)
51Testing软件测试网|/`C/Tec%i9|4q0008c914 ???????? (e2e8194c, 1, fe4d6a80, 98564, 8, e2e81868)
n6~]pc;\)j@:M%T0fe5324e8 __1cMStubRoutinesG_code1_ (e2e819d8, e2e81c10, a, f6cb5000, 4, e2e818f0) + 3ec
51Testing软件测试网,{'q7A7]7l3K?-P#Ufe0cbe94 __1cJJavaCallsLcall_helper6FpnJJavaValue_pnMmethodHandle_pnRJavaCallArguments_pnGThread__v_ (e2e81c08,fe4c8000, e2e81b54, 1e2fd8, 8e764, e2e81c10) +308
51Testing软件测试网 t
s,rO.D*^9V {.{fe1f6dbc __1cJJavaCallsMcall_virtual6FpnJJavaValue_nLKlassHandle_nMsymbolHandlee81c08, e2e81b54) + 150pnGThread__v_(f6cb64b8, e2e81b40, e2e81b44, fe4c8000, e2d8) + 60e_5pnGThread__v_ (e2e81c08, e2e81c04, e2e81c00,e2e81bf4, e2e81bec, 1e2f8000, e2e81d10, 1e, e) + 120FpnKJavaThread_pnGThread__v_ (f6817ff8, 1e2fd8, fe4c
51Testing软件测试网pc+c u$RV3M_W"v7fd70) + 3d8cKJavaThreadDrun6M_v_ (e2e02000, fe4d3e34, fe4c8000, 7fd70, 1e2fd8,
51Testing软件测试网.I0} lU#b%g/`)yfe213ec8 _start (fe4c8000, fe625d10, 0, 5, 1, fe401000) + 20
51Testing软件测试网t~1D1Y_ff36b728 _thread_start (1e2fd8, 0, 0, 0, 0, 0) + 40
OS9KfO6r0~1~Qf
~*H
L"w s%Z0通过在 Java 进程中执行以下命令对服务器进行 Thread Dump:
;TB AE[ ty0kill -3 <PID>。
1@ES[w0由于 lwp# 8 映射到 thread #76,您可以将 76 换算为十六进制值 4c。
0n#o]@N lr)M0该值映射到 JVM Thread Dump 中的 nid=0x4c:
51Testing软件测试网
x
iwWgo2f @7`2p@q#w1L*W@0"Thread-6" prio=5 tid=0x1e2fd8 nid=0x4c waiting on monitor
http://0xe2e81000..0xe2e819d851Testing软件测试网c5X|}2q
Bo*MHat java.lang.Thread.sleep(Native Method)
51Testing软件测试网3|XN%Eb2R%l4Bbat weblogic.management.deploy.GenericAppPoller.run(GenericAppPoller.java:139)
51Testing软件测试网4U(o%w"\
j \f#?s;`kf
@51Testing软件测试网'pspIw(H在此示例中,占用最多 CPU 资源的线程实际上正处于休眠状态。应用程序轮询程序在开发模式启动的服务器上运行。由于它每隔 30 秒运行一次,因此显然无法及时捕捉 Thread Dump 以了解此线程中的活动。
51Testing软件测试网0[n;a(n?:N3mz4I+Z0J2[ \
\&Qd)j+~Y$wN)Z0理想状态下,应当迅速并且连续完成全部三个步骤,以便尽可能及时地捕捉数据。这可以通过类似下面的一个简单的
shell 脚本来完成。
51Testing软件测试网/xy!\,vNw&k51Testing软件测试网'I(o^1u MA(zu:`#
^9o`e/D*w0v7N0# Takes an argument (PID of the WLS process) and loops three times. This will append the prstat information to a file called dump_high_cpu.txt. The thread dump information will either be in file where stdout was redirected or printed on the screen.
v%k]k7z2O*h0#
51Testing软件测试网+]\h/[X51Testing软件测试网s7DL3R]for loopnum in 1 2 3
1p8K T^m$uS_i%L0do
51Testing软件测试网[8_ {w~"vprstat -L -p $1 1 1 >> dump_high_cpu.txt
#Y]
ydQ;{0pstack $1 >> dump_high_cpu.txt
L;|sR"e(J0kill -3 $1
Z FU-ZmG3d&iG0echo "prstat, pstack, and thread dump done. #" $loopnum
P-s1j7hD0sleep 1
51Testing软件测试网p&o,at/FXecho "Done sleeping."
51Testing软件测试网%g*T0W6l%D7O!d@-^done
51Testing软件测试网[
q1X'MyE5K Yi,x1qg&FZE0然后,您可以检查该线程以确定它正在执行的任务以及是否出现问题。
51Testing软件测试网7MD$eJ!wfw返回页首