Jstack is the command line tool get thread dumps out of JVM processes. Let’s improve it a bit.
jstack is a command-line utility 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?
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
#!/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.
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.
Do you have any hack to make tools even better? Let’s hear about that in the comments!