JStack – Java Thread Dump Analyzer

A thread dump is a list of all the Java threads that are currently active in a Java Virtual Machine (JVM). There are several ways to take thread dumps from a JVM. It is highly recommended to take more than 1 thread dump while analyzing any problem such as deadlock or resource usage analysis. It is always better to confirm in more than one thread dump than make conclusions in a single attempt.

1. Get PID of a Java Process

The first piece of information you will need to be able to obtain a thread dump is your java process’s PID.

The java JDK ships with the jps command which lists all java process ids. You can run this command like this:

$ jps -l

Remember – you may have to run this command as $ sudo -u jps -l, where “user” is the username of the user that the java process is running as.

Even now, if you are not able to find out process id, use the below command:

$ ps -aef | grep java

2. Request a Thread Dump from JVM

If installed/available, we recommend using the jstack tool. It prints thread dumps to the command line console.

To obtain a thread dump using jstack, run the following command:

$ jstack

You can output consecutive thread dumps to a file by using the console output redirect/append directive:

$ jstack  >> threaddumps.log

Important points to note:

  1. The jstack tool is available since JDK 1.5.
  2. jstack works even if the -Xrs JVM parameter is enabled.
  3. It’s not possible to use the jstack tool from JDK 1.6 to take thread dumps from a process running on JDK 1.5.

3. Script to Collect Thread Dumps at Fixed Intervals

This simple shell script takes several jstack snapshots in fixed time intervals: [Reference document]

#!/bin/bash
 
if [ $# -eq 0 ]; then
    echo >= 2 "Usage: jstackSeries  [ count [ delay ] ]"
    echo >= 2 "    Defaults: count = 10, delay = 1 (seconds)"
    exit 1
fi
 
pid=$1          # required
count=${2:-10}  # defaults to 10 times
delay=${3:-1} # defaults to 1 second
 
while [ $count -gt 0 ]
do
    jstack $pid >jstack.$pid.$(date +%H%M%S.%N)
    sleep $delay
    let count--
    echo -n "."
done

Use the above script like this:

$ jstackSeries  10 5

4. Compare Two Thread Dumps

To compare thread dumps, you may use interactive difference viewers, e.g.

$ vimdiff file1 file2 file3 file4 # up to 4 files

Another way to see what parts of the jstack trace are changing over time is to compare adjacent jstack trace using $ context diff (-c option):

d_old=""
for d in jstack.13585.12171*
do
  if [ -n "$d_old" ]
  then
    diff -c "$d_old" "$d"
  fi
  d_old="$d"
done

Here, the result shows only the places where the JStack thread dump changes from file to file.

Happy Learning !!

Comments

Subscribe
Notify of
guest
7 Comments
Most Voted
Newest Oldest
Inline Feedbacks
View all comments

About Us

HowToDoInJava provides tutorials and how-to guides on Java and related technologies.

It also shares the best practices, algorithms & solutions and frequently asked interview questions.

Our Blogs

REST API Tutorial

Dark Mode

Dark Mode