JStall VSCode Extension

A tiny vscode extension to integrate the jstall CLI tool,
giving you JVM diagnostics (thread analysis, deadlock detection, flame graphs, …) directly in your IDE,
instead of just basic thread dumps.
JStall is aimed at the moment when a JVM looks suspicious, stuck, or just slower than expected,
and you want better diagnostics without switching to external tools.
The extension supports:
- Running JStall commands (status, record, flame) on a running JVM directly from the IDE,
with automatic PID detection from debug sessions, run sessions, and terminal-launched Java processes
- Displaying flamegraphs in an interactive embedded viewer
- Analyzing and extracting JStall recording ZIP files via context menu or command palette
- Integration with GitHub Copilot and other AI assistants through custom Language Model Tools
Flamegraphs are obtained via the embedded async-profiler and therefore is only supported
on macOS and Linux.
Quick Start
- Install the extension
- Open a Java project
- Run or debug a Java application
- Use Cmd+Shift+J (macOS) / Ctrl+Shift+J (Windows/Linux) to open the JStall Quick Actions menu
- Choose Status, Flamegraph, or Record
When a JVM is detected (from a debug session, run session, or terminal), the status bar shows:
$(play) JStall: MyApp (12345) Status Flame Record
Click the JVM name for quick actions, or use the individual buttons.
The same Status, Flame, and Record buttons also appear in the editor title bar
when a JVM is active.
Commands
Live JVM Diagnostics
| Command |
Description |
| JStall: Status |
Analyze a running JVM — thread dumps, deadlock detection, top threads |
| JStall: Flamegraph |
Capture a CPU flamegraph and display it in an interactive HTML viewer |
| JStall: Record |
Record JVM diagnostics over time into a ZIP file (auto-saved to .jstall/ directory) |
| JStall: Quick Actions |
Quick-pick menu for all three actions above |
All commands auto-detect the active JVM from debug/run sessions.
When invoked from the command palette, they show a JVM picker with the active JVM pre-selected.
Recording File Actions
Right-click a .zip file in the Explorer to see a JStall submenu:
| Command |
Description |
| JStall: Recording Summary |
Quick overview of the recording contents (JVMs, size, metadata) |
| JStall: Replay Recording |
Run jstall status on a recording and display the full analysis |
| JStall: Flamegraph from Recording |
Extract and display the embedded flamegraph |
| JStall: Extract Recording |
Extract the recording ZIP contents into a folder |
These commands are also available from the command palette.
If a file is not a valid JStall recording, the commands will report a clear error.
Flamegraph Viewer
The flamegraph viewer opens each flamegraph in its own VS Code tab, allowing side-by-side comparison.
Flamegraphs are interactive HTML visualizations powered by async-profiler.
JVM Detection
The extension automatically detects running JVMs from three sources:
- Debug sessions — Java debug sessions started from VS Code
- Run sessions — "Run without Debugging" sessions (noDebug mode)
- Terminal processes — Java processes launched from the integrated terminal (polled every 3 seconds)
The active JVM is shown in the status bar and pre-selected in the JVM picker.
AI Assistant Integration
The extension registers five Language Model Tools for use by GitHub Copilot and other AI assistants:
| Tool |
Description |
#jstall_list_jvms |
List all running JVM processes |
#jstall_run |
Run any jstall CLI command (deadlock, threads, vm-vitals, etc.) |
#jstall_status |
Full JVM status diagnostics with all parameters (live or recording) |
#jstall_flamegraph |
Capture a CPU profiling flamegraph (live or from recording) |
#jstall_record |
Record JVM diagnostics to a ZIP file |
Use these in Copilot Chat by referencing the tool name, e.g.:
"Use #jstall_run to check what my Java app is doing"
Settings
Configurable under Settings → Extensions → JStall:
| Setting |
Description |
Default |
jstall.javaPath |
Path to Java 17+ executable (empty = auto-detect) |
"" |
jstall.fullDiagnostics |
Include expensive analyses (VM vitals, metaspace, etc.) |
Off |
jstall.intelligentFilter |
Collapse framework internals in stack traces |
Off |
jstall.noNative |
Skip threads without Java stack traces |
Off |
jstall.keep |
Persist thread dumps to disk |
Off |
jstall.top |
Number of top threads to display |
3 |
jstall.recordIntervalSeconds |
Seconds between recording samples |
5 |
jstall.flameDurationSeconds |
Profiling duration in seconds |
10 |
jstall.recordingDir |
Directory for recordings (relative to workspace root) |
.jstall |
And the same for the MCP tool defaults.
MCP-specific defaults are configurable with:
jstall.mcp.status.*
jstall.mcp.flamegraph.*
jstall.mcp.record.*
Keyboard Shortcuts
| Shortcut |
Command |
| Cmd+Shift+J / Ctrl+Shift+J |
JStall: Quick Actions |
Requirements
- Java 17+ — The extension auto-detects Java from
JAVA_HOME, macOS java_home, common paths, and PATH.
Override with the jstall.javaPath setting if needed.
- jstall.jar — Automatically downloaded from GitHub Releases at build time. Run
npm run download-jar if missing.
Installation
From Source
cd /path/to/jstall-vscode-extension
npm install
npm run compile
Then press F5 in VS Code to launch the Extension Development Host.
Package as VSIX
npm install
npx @vscode/vsce package
Install the resulting .vsix file via Extensions → ⋯ → Install from VSIX…
Releasing a new version
- Update the version in
package.json (e.g. to 0.1.0)
- Update the
CHANGELOG.md with the new version and changes
- Commit the changes and push to GitHub, tagging the commit with the version (e.g.
git tag v0.1.0)
- Upload to the marketplace
Support, Feedback, Contributing
This project is open to feature requests/suggestions, bug reports etc.
via GitHub issues.
Contribution and feedback are encouraged and always welcome.
License
MIT, Copyright 2026 SAP SE or an SAP affiliate company, Johannes Bechberger and contributors