[b]jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息[/b],经常用来分析java应用程序CPU占用过高的问题。
假定有以下代码:
执行时CPU占用 100%
在命令行cmd执行:
jps 得到进程的PID号 10284
cmd执行 jstack -l 10284 > res.txt
得到堆截栈信息
结果给出了关键信息:
"Thread-0" prio=6 tid=0x0b593c00 nid=0x3244 runnable [0x0b7af000..0x0b7afa14]
java.lang.Thread.State: RUNNABLE
at App$1.run(App.java:11)
Locked ownable synchronizers:
- None
main" prio=6 tid=0x00bc7400 nid=0x3444 runnable [0x00dbf000..0x00dbfe50]
java.lang.Thread.State: RUNNABLE
at App.main(App.java:19)
Locked ownable synchronizers:
- None
[b]代码 11行和19行发生死锁了。[/b]
分析CPU占用过高,jstack这个工具还是挺好用的。
假定有以下代码:
public class App
{
public static void main(String[] args)
{
Thread td = new Thread()
{
@Override
public void run()
{
while (true) {
;
}
}
};
td.start();
while (true) {
;
}
}
}
执行时CPU占用 100%
在命令行cmd执行:
jps 得到进程的PID号 10284
C:\JavaDev\jdk1.6.0_02\bin>jps
CryptQueryObject failed with 80092009
12240 Jps
5836 Program
10284 App
C:\JavaDev\jdk1.6.0_02\bin>
cmd执行 jstack -l 10284 > res.txt
得到堆截栈信息
2013-03-08 17:30:04
Full thread dump Java HotSpot(TM) Client VM (1.6.0_02-b06 mixed mode):
"Thread-0" prio=6 tid=0x0b593c00 nid=0x3244 runnable [0x0b7af000..0x0b7afa14]
java.lang.Thread.State: RUNNABLE
at App$1.run(App.java:11)
Locked ownable synchronizers:
- None
"Low Memory Detector" daemon prio=6 tid=0x0afbc000 nid=0x3300 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"CompilerThread0" daemon prio=10 tid=0x0afbb000 nid=0x37e8 waiting on condition [0x00000000..0x0b4bf79c]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Command Reader" daemon prio=6 tid=0x0afad000 nid=0x26c4 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Event Helper Thread" daemon prio=6 tid=0x0afac000 nid=0x3130 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"JDWP Transport Listener: dt_socket" daemon prio=6 tid=0x0afaa000 nid=0x31b8 runnable [0x00000000..0x0b3cfae0]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Attach Listener" daemon prio=10 tid=0x0af99400 nid=0x2af8 waiting on condition [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Signal Dispatcher" daemon prio=10 tid=0x0af9f800 nid=0x2f58 runnable [0x00000000..0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Finalizer" daemon prio=8 tid=0x0af88400 nid=0x29a4 in Object.wait() [0x0b0ff000..0x0b0ffa94]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e70b48> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x02e70b48> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
Locked ownable synchronizers:
- None
"Reference Handler" daemon prio=10 tid=0x0af84000 nid=0x3264 in Object.wait() [0x0b0af000..0x0b0afb14]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x02e70a48> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x02e70a48> (a java.lang.ref.Reference$Lock)
Locked ownable synchronizers:
- None
"main" prio=6 tid=0x00bc7400 nid=0x3444 runnable [0x00dbf000..0x00dbfe50]
java.lang.Thread.State: RUNNABLE
at App.main(App.java:19)
Locked ownable synchronizers:
- None
"VM Thread" prio=10 tid=0x0af81000 nid=0x36b0 runnable
"VM Periodic Task Thread" prio=10 tid=0x0afbd800 nid=0x3278 waiting on condition
JNI global references: 992
结果给出了关键信息:
"Thread-0" prio=6 tid=0x0b593c00 nid=0x3244 runnable [0x0b7af000..0x0b7afa14]
java.lang.Thread.State: RUNNABLE
at App$1.run(App.java:11)
Locked ownable synchronizers:
- None
main" prio=6 tid=0x00bc7400 nid=0x3444 runnable [0x00dbf000..0x00dbfe50]
java.lang.Thread.State: RUNNABLE
at App.main(App.java:19)
Locked ownable synchronizers:
- None
[b]代码 11行和19行发生死锁了。[/b]
分析CPU占用过高,jstack这个工具还是挺好用的。