
Welcome to the last blog post of the year. Last week, I discussed the limitations of custom JFR events. This week, I’ll also be covering a profiling-related topic and showcasing a tiny tool called JStall.
I hope I’m not the only one who sometimes wonders: “What is my Java application doing right now?” When you don’t see any output. Yes, you could perform a simple thread dump via jstack, but it is hard to understand which threads are actually consuming CPU and making any sort of progress. This is where my tiny tool called JStall comes in:
JStall is a small command-line tool for one-shot inspection of running JVMs using thread dumps and short, on-demand profiling. The tool essentially takes multiple thread dumps of your application and uses the per-thread cpu-time information to find the most CPU-time-consuming Java threads.
First, download the JStall executable from the GitHub releases page. Let us then start by finding the currently running JVMs:
> ./jstall Usage: jstall <command> <pid|files> [options] Available commands: status - Show overall status (deadlocks + most active threads) deadlock - Check for deadlocks most-work - Show threads doing the most work flame - Generate flame graph threads - List all threads Available JVMs: 7153 ./jstall 1223 <unknown> 8136 ./renaissance-gpl-0.16.0.jar 6138 org.jetbrains.idea.maven.server.RemoteMavenServer36 5597 DeadlockDemo 49294 com.intellij.idea.Main
This provides us with a list of options for the main status command, as well as a list of JVM processes and their corresponding main classes. Let’s start checking for deadlocking:
Continue reading

