Deadlocks shouldn't be invisible.
DIXY helps Java developers detect, investigate, and understand application deadlocks with JVM-level diagnostics and developer-friendly tooling.
curl -fsSL https://raw.githubusercontent.com/roy-gunjan743/DIXY-CLI/main/install.sh | shmacOS / Linux. Needs Java 21+. Windows and other options
$ dixy detect --jar ./orders-service.jar
Agent Started Successfully
Reporting detected deadlocks to: http://localhost:8081/api/internal/deadlocks
[2026-10-30T09:14:00Z] threads=14 locks=6 waits=0 cycles=0
[2026-10-30T09:14:01Z] threads=14 locks=6 waits=1 cycles=0
[2026-10-30T09:14:02Z] threads=14 locks=6 waits=2 cycles=1
ALERT: DEADLOCK CYCLE 1
worker-2 holds Monitor-2351897819504; worker-1 waits for it
worker-1 holds Monitor-2351897820112; worker-2 waits for it
$ echo $?
1 # deadlock found
The problem
One blocked thread can hide an entire system problem.
Deadlocks are relationships, not errors. Nothing throws, nothing logs — two threads simply wait for each other forever.
Hard to identify
A deadlocked service doesn't crash. It just stops answering, and from the outside it looks like a slow dependency.
BLOCKED "worker-1" waiting to lock <0x…504>
at OrderService.reserve(…)
BLOCKED "worker-2" waiting to lock <0x…112>
at Inventory.commit(…)
RUNNABLE "http-nio-8080-exec-3"
… 37 more threads
Hard to investigate
The evidence is a relationship between threads and locks, spread across dozens of stack traces.
- 1. find the pid
- 2. dump the threads
- 3. read every trace
- 4. map who holds what
- 5. repeat on the next host
Manual JVM diagnostics are costly
Capturing dumps at the right moment, on the right host, then reading them by hand takes time you don't have during an incident.
How it works
Discover. Analyze. Diagnose.
- 01
Discover
The Java agent attaches to your JVM and collects lock and thread events from JVMTI, JFR and a thread-state poller.
- 02
Analyze
Each event updates a wait-for graph: which thread owns each lock, and which thread waits for which lock.
- 03
Diagnose
Cycle detection finds threads waiting on each other and reports exactly who holds what — in the CLI and the REST API.
Features
Built on the JVM's own signals.
Every badge below is backed by code in the repository. See the full feature matrix.
JVM-level diagnostics
jvmti->SetEventNotificationMode( JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, nullptr);jvmti->SetEventNotificationMode( JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, nullptr);Java agent integration
java -javaagent:dixy-agent.jar=serverUrl=http://localhost:8081,apiKey=…,appName=orders \ -jar orders-service.jarThread and synchronization monitoring
Wait-for graph analysis
- thread
- lock
- holds
- waits
- deadlock cycle
CLI experience
dixy opens an interactive shell with tab completion. dixy detect scans non-interactively with JSON output and exit codes for scripts.$ dixydixy> statusdixy> threads listdixy> deadlocks detectdixy> detect --json
Diagnostic event collection
curl -H "X-API-Key: dixy-local-dev-key-123" \ http://localhost:8081/api/deadlocksArchitecture
From JVM event to deadlock report.
Hover or select a component to see its role and the source file behind it.
Target JVM
Collection
Processing
Detection
Output
Cycle detection
DeadlockDetectorAvailableDepth-first search for cycles. PinningDetector keeps cycles containing a PINS edge.
CLI
Every command here exists in the code.
Copied from the command definitions in the repository.
dixyterminalOpen the interactive dixy> shell.
dixy detect --pid <pid>terminalAttach the agent to a running JVM and scan every second.
dixy detect --jar <path> --jsonterminalSame scan, machine-readable {"cycles":[...]} snapshots.
dixy <app-directory>terminalPick a runnable jar in the folder, start it with the agent, open the shell.
statusshellDiagnostic status: HEALTHY / WARNING / CRITICAL.
deadlocks listshellList the latest stored deadlock reports.
events listshellRecent raw JVMTI events (LockOwned / LockReleased).
helpshellList every command and its options.
All 19 commands are in the CLI reference.
Why DIXY
Ad-hoc diagnosis vs. a dedicated workflow.
A qualitative comparison of how the work gets done. No benchmarks, no competitor claims.
| Task | Ad-hoc manual | With DIXY |
|---|---|---|
| Finding the deadlock | Spot a hang, then take thread dumps at the right moment | Continuous scan every second; alert as soon as a cycle exists |
| Reading the evidence | Cross-reference lock addresses across many stack traces | Prints each edge: who holds which lock, who waits for it |
| Virtual threads | Look for pinning separately with JFR tooling | jdk.VirtualThreadPinned feeds the same graph |
| Automation | Ad-hoc scripts around dump tools | Exit code 1 on deadlock, --json output |
| History | Dumps saved wherever someone put them | Reports stored and queryable via CLI and REST |
Make your Java applications easier to debug.
Open source, MIT licensed, and built on JVMTI and JFR.