A better jstack
Jstack is the command line tool get thread dumps out of JVM processes. Let’s improve it a bit so that we can call jstack <classFQN>
.
Presentation
jstack is a CLI tool that connects to a JVM identified by its PID and creates a thread dump. It is very handy. However I don’t like to type PIDs. Wouldn’t it be much better if it could identify a JVM based on part of the main class name?
Jstack by name
My initial solution was to type something along the lines of jstack $(jps | grep MyClass | cut -d ' ' -f 1)
.
That’s good but not great.
Instead, I came up with that simple script that I added before $JAVA_HOME/bin
in my PATH
.
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
if [[ $1 =~ ^[a-zA-Z]+$ ]]
then
echo "# Trying to get thread dump of Java process with name '$1'"
pid=`jps | grep "$1" | cut -d ' ' -f 1`
shift
echo $JAVA_HOME/bin/jstack $pid $@
$JAVA_HOME/bin/jstack $pid $@
else
echo "# Executing regular jstack"
$JAVA_HOME/bin/jstack $@
fi
That’s it.
Now I can use jstack MyClass
.
It is a simple hack but I have found it very useful over the last months.
Even better, it does not prevent using regular jstack command-line parameters.
A word about thread dumps
Reading thread dumps can be cumbersome. To filter them or query them, mjprof can be useful. It is a thread-dump parser written by Haim Yadid (lifey on Github). I find it a bit difficult to use, but once you get your first filters working, it is quite useful.
If you have any question/comment, feel free to send me a tweet at @pingtimeout. And if you enjoyed this article and want to support my work, you can always buy me a coffee ☕️.