Java Tools Tutorials - Herong's Tutorial Examples - v6.24, by Herong Yang
jstack - Stack Tracer to Generate Thread Dump
This section provides a tutorial example on how to use the 'jstack' tool to generate a thread dump (print all running threads and their stack traces).
What Is "jstack"? - "jstack" is a JVM troubleshooting tool that generates a thread dump (prints stack traces of all running threads) of a given JVM process, a Java core file, or remote debug server. The "jstack" tool supports several functions as shown the this help message:
herong> jstack -help
Usage:
jstack [-l] <pid>
(to connect to running process)
Options:
-l long listing. Prints additional information about locks
-h or -help to print this help message
In order to test "jstack", I used this simple Java program, LongSleep.java:
/* LongSleep.java
* Copyright (c) 2005 HerongYang.com. All Rights Reserved.
*/
class LongSleep {
public static void main(String[] a) {
Runtime rt = Runtime.getRuntime();
System.out.println(" Free memory: " + rt.freeMemory());
System.out.println("Total memory: " + rt.totalMemory());
try {Thread.sleep(1000*60*60);}
catch (InterruptedException e) {}
}
}
When LongSleep.java is running, I used "jps" to get its JVM process ID, pid. Then I ran "jstack" with that pid to generate a thread dump:
herong> javac LongSleep.java
herong> java LongSleep
Free memory: 61276680
Total memory: 62914560
(Start another command window.)
herong> jps -l -m
3296 LongSleep
2224 jdk.jcmd/sun.tools.jps.Jps -l -m
(Generate thread dump)
herong> jstack 3296
Full thread dump Java HotSpot(TM) 64-Bit Server VM (10.0.1+10 mixed mode):
Threads class SMR info:
_java_thread_list=0x0000000023edc100, length=11, elements={...}
"main" #1 prio=5 os_prio=0 tid=0x0000000000231800
nid=0x3d1c waiting on condition [0x000000000211f000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@10.0.1/Native Method)
at LongSleep.main(LongSleep.java:9)
"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000000001fb5b800
nid=0x2cec waiting on condition [0x00000000235af000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList
(java.base@10.0.1/Native Method)
"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000001fb5f800
nid=0x13f8 in Object.wait() [0x000000002375e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@10.0.1/Native Method)
- waiting on <0x00000000c7b09410>
(a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove
(java.base@10.0.1/ReferenceQueue.java:151)
- waiting to re-lock in wait() <0x00000000c7b09410>
(a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove
(java.base@10.0.1/ReferenceQueue.java:172)
"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000023156000
nid=0x176c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000023159000
nid=0x1d58 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"C2 CompilerThread0" #6 daemon prio=9 os_prio=2 tid=0x000000002315a000
nid=0x2970 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C2 CompilerThread1" #7 daemon prio=9 os_prio=2 tid=0x0000000023162000
nid=0x2f7c waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"C1 CompilerThread2" #8 daemon prio=9 os_prio=2 tid=0x000000002316b000
nid=0x3380 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task
"Sweeper thread" #9 daemon prio=9 os_prio=2 tid=0x000000002318d800
nid=0x3d0c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x0000000023edb800
nid=0x1a2c runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"Common-Cleaner" #11 daemon prio=8 os_prio=1 tid=0x0000000023ee1000
nid=0x41d0 in Object.wait() [0x000000002468f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@10.0.1/Native Method)
- waiting on <0x00000000c7a3ea58>
(a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove
(java.base@10.0.1/ReferenceQueue.java:151)
- waiting to re-lock in wait() <0x00000000c7a3ea58>
(a java.lang.ref.ReferenceQueue$Lock)
"VM Thread" os_prio=2 tid=0x000000001fb56000 nid=0x34a0 runnable
"GC Thread#0" os_prio=2 tid=0x0000000000249000 nid=0x3c80 runnable
"GC Thread#1" os_prio=2 tid=0x000000000024a800 nid=0x4164 runnable
"GC Thread#2" os_prio=2 tid=0x000000000024c800 nid=0x39a0 runnable
"GC Thread#3" os_prio=2 tid=0x0000000000252000 nid=0x4248 runnable
"G1 Main Marker" os_prio=2 tid=0x0000000000287000 nid=0x2c18 runnable
"G1 Conc#0" os_prio=2 tid=0x0000000000288800 nid=0x30f0 runnable
"G1 Refine#0" os_prio=2 tid=0x000000001fa72800 nid=0x3bf4 runnable
"G1 Refine#1" os_prio=2 tid=0x000000001fa73800 nid=0x2cc0 runnable
"G1 Refine#2" os_prio=2 tid=0x000000001fa7a800 nid=0x2468 runnable
"G1 Refine#3" os_prio=2 tid=0x000000001fa7e000 nid=0x3c28 runnable
"G1 Young RemSet Sampling" os_prio=2 tid=0x000000001fa7f000
nid=0x413c runnable
"VM Periodic Task Thread" os_prio=2 tid=0x0000000023ee1800
nid=0x16f0 waiting on condition
JNI global references: 2
Cool. I got my first thread dump of a JVM process. Now I know how many threads are running inside the JVM, 8 of them. But my Java application, LongSleep, only runs under 1 thread named as "main", which is in a state called, TIMED_WAITING. This matches my expectation.
Table of Contents
javac - The Java Program Compiler
java - The Java Program Launcher
jpackage - Binary Package Builder
javadoc - The Java Document Generator
jdeps - The Java Class Dependency Analyzer
jdeprscan - The Java Deprecated API Scanner
jcmd - The JVM Diagnostic Tool
jconsole - Java Monitoring and Management Console
jstat - JVM Statistics Monitoring Tool
JVM Troubleshooting Tools in JDK
jinfo - VM Option Value Checker
jinfo - Changing HotSpot VM Option
►jstack - Stack Tracer to Generate Thread Dump
Java Thread Deadlock Demo Program
jstack - Detecting Java Thread Deadlocks
Printing Histogram of Java Object Heap
jmap - Generating Heap Dump File
jhat - Java Heap Analysis Tool
jhat - Starting Web Server on a Heap Dump File
Listing Instance Counts of All Classes
Browsing Object Instance Values
Searching for Instances with OQL Statements
jhsdb - The Java HotSpot Debugger
jvisualvm (Java VisualVM) - JVM Visual Tool
javap - The Java Class File Disassembler
keytool - Public Key Certificate Tool
jrunscript - Script Code Shell
native2ascii - Native-to-ASCII Encoding Converter