jstack
语法
jstack [option] <pid>
说明:
option
命令选项,常用选项如下:
-F
当’jstack [-l] pid’没有相应的时候强制打印栈信息,如果直接jstack无响应时,用于强制jstack),一般情况不需要使用
Attaching to process ID 2104, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09
Deadlock Detection:
No deadlocks found.
Thread 1: (state = BLOCKED)
Thread 10: (state = IN_JAVA)
- test.Test$Task.run() @bci=0, line=13 (Interpreted frame)
- java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
Thread 6: (state = BLOCKED)
Thread 5: (state = BLOCKED)
Thread 4: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=59, line=144 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=165 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=36, line=216 (Interpreted frame)
Thread 3: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=502 (Interpreted frame)
- java.lang.ref.Reference.tryHandlePending(boolean) @bci=54, line=191 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=1, line=153 (Interpreted frame)
-l
长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表,会使得JVM停顿得长久得多(可能会差很多倍,比如普通的jstack可能几毫秒和一次GC没区别,加了-l 就是近一秒的时间),-l 建议不要用。一般情况不需要使用
2019-07-22 15:41:02
Full thread dump Java HotSpot(TM) Client VM (25.201-b09 mixed mode):
"DestroyJavaVM" #9 prio=5 os_prio=0 tid=0x0171d000 nid=0x1e04 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Thread-0" #8 prio=5 os_prio=0 tid=0x15a2ac00 nid=0x1c50 runnable [0x1602f000]
java.lang.Thread.State: RUNNABLE
at test.Test$Task.run(Test.java:13)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x159db800 nid=0x1d28 runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
...
-m
打印java和native c/c++框架的所有栈信息.可以打印JVM的堆栈,显示上Native的栈帧,一般应用排查不需要使用
Attaching to process ID 2104, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 25.201-b09
Deadlock Detection:
No deadlocks found.
----------------- 0 -----------------
0x771a1d8c ntdll!ZwWaitForSingleObject + 0xc
0x76cd8712 KERNELBASE!WaitForSingleObject + 0x12
0x00d45120 javaw + 0x5120
0x00d43475 javaw + 0x3475
0x00d44562 javaw + 0x4562
0x00d43703 javaw + 0x3703
----------------- 1 -----------------
0x771a1d8c ntdll!ZwWaitForSingleObject + 0xc
0x76cd8712 KERNELBASE!WaitForSingleObject + 0x12
0x6da43889 jvm!_JVM_FindSignal@4 + 0x2979
0x6d9ddec1 jvm!JVM_GetThreadStateNames + 0x4f391
0x6d9de256 jvm!JVM_GetThreadStateNames + 0x4f726
0x6d9ff411 jvm!JVM_GetThreadStateNames + 0x708e1
0x6d95c325 jvm!JNI_GetCreatedJavaVMs + 0x5965
0x00d42175 javaw + 0x2175
0x00d4b05f javaw + 0xb05f
0x00d4b0e9 javaw + 0xb0e9
0x73c78744 KERNEL32!BaseThreadInitThunk + 0x24
0x7719587d ntdll!RtlGetAppContainerNamedObjectPath + 0xfd
0x7719584d ntdll!RtlGetAppContainerNamedObjectPath + 0xcd
...
pid
进程id
实战
1、运行如下代码
public class Test {
public static void main(String[] args) {
while(true) {
}
}
}
2、执行jps命令获取进程id:
jps
14100 Test
2104 Test
2764
7644 Jps
3、执行jstack pid命令:查看pid进程内线程信息:
2019-07-22 15:49:28
Full thread dump Java HotSpot(TM) Client VM (25.201-b09 mixed mode):
"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x14ef2000 nid=0x2f7c runnable [0x00000000]
java.lang.Thread.State: RUNNABLE
"C1 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x14e98800 nid=0x1ca0 waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x14e8b400 nid=0x29ac waiting on condition [0x00000000]
java.lang.Thread.State: RUNNABLE
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0