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 then making conclusions in single attempt.
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 below command:
ps -aef | grep java
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
This simple shell script takes several jstack snapshots in fixed time intervals: [Reference document]
#!/bin/bash if [ $# -eq 0 ]; then ??? echo >&2 "Usage: jstackSeries [ [ ] ]" ??? 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 above script like this:
jstackSeries 10 5
To compare the results you may use interactive diff 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 trace changes from file to file.