The release of JDK 8 introduced Java Mission Control, Java Flight Recorder, and jcmd
utility for diagnosing problems with JVM and Java applications. It is suggested to use the latest utility, jcmd
instead of the previous jstack
utility for enhanced diagnostics and reduced performance overhead.
The following sections describe troubleshooting techniques with jstack
utility.
The jstack
command-line utility attaches to the specified process or core file and prints the stack traces of all threads that are attached to the virtual machine, including Java threads and VM internal threads, and optionally native stack frames. The utility also performs deadlock detection.
The utility can also use the jsadebugd
daemon to query a process or core file on a remote machine. Note: The output takes longer to print in this case.
A stack trace of all threads can be useful in diagnosing a number of issues, such as deadlocks or hangs.
The -l
option, which instructs the utility to look for ownable synchronizers in the heap and print information about java.util.concurrent.locks
. Without this option, the thread dump includes information only on monitors.
The output from the jstack
pid option is the same as that obtained by pressing Ctrl+\ at the application console (standard input) or by sending the process a QUIT signal. See Control+Break Handler for an output example.
Thread dumps can also be obtained programmatically using the Thread.getAllStackTraces
method, or in the debugger using the debugger option to print all thread stacks (the where
command in the case of the jdb
sample debugger).
For more details on the jstack
utility, see the jstack
command man page.
If the jstack
pid command does not respond because of a hung process, then the -F
option can be used (on Oracle Solaris and Linux operating systems only) to force a stack dump, as shown in Example 2-29.
To obtain stack traces from a core dump, execute the jstack
command on a core file, as shown in Example 2-30.
The jstack
utility can also be used to print a mixed stack; that is, it can print native stack frames in addition to the Java stack. Native frames are the C/C++ frames associated with VM code and JNI/native code.
To print a mixed stack, use the -m
option, as shown in Example 2-31.
Frames that are prefixed with an asterisk (*) are Java frames, whereas frames that are not prefixed with an asterisk are native C/C++ frames.
The output of the utility can be piped through c++filt
to demangle C++ mangled symbol names. Because the Java HotSpot VM is developed in the C++ language, the jstack
utility prints C++ mangled symbol names for the Java HotSpot internal functions.
The c++filt
utility is delivered with the native C++ compiler suite: SUNWspro
on Oracle Solaris operating system and gnu
on Linux.