Skip to content
v1.0.4 released

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 | sh

macOS / Linux. Needs Java 21+. Windows and other options

~/orders-service — dixy detect
$ 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
Representative output · format from cli/DetectApplicationRunner.java
Java 21JVMTI native agentJava Flight RecorderVirtual threadsSpring Boot + Spring ShellMIT licensed

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.

Hard to investigate

The evidence is a relationship between threads and locks, spread across dozens of stack traces.

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.

  1. 01

    Discover

    The Java agent attaches to your JVM and collects lock and thread events from JVMTI, JFR and a thread-state poller.

  2. 02

    Analyze

    Each event updates a wait-for graph: which thread owns each lock, and which thread waits for which lock.

  3. 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.

01Available

JVM-level diagnostics

A native C++ JVMTI agent subscribes to monitor-contention events, so DIXY sees the moment a thread blocks on a monitor and the moment it gets it.
native/src/agent.cpp · excerpt
jvmti->SetEventNotificationMode(
JVMTI_ENABLE,
JVMTI_EVENT_MONITOR_CONTENDED_ENTER, nullptr);
jvmti->SetEventNotificationMode(
JVMTI_ENABLE,
JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, nullptr);
02Available

Java agent integration

Attach to any Java 21 application with -javaagent, or let dixy detect launch or attach for you. Detected cycles are pushed to the backend; a network failure never breaks your app.
bash
java -javaagent:dixy-agent.jar=serverUrl=http://localhost:8081,apiKey=…,appName=orders \
-jar orders-service.jar
03Available

Thread and synchronization monitoring

JFR streams thread lifecycle, monitor and park events — including jdk.VirtualThreadPinned for virtual-thread pinning — while a poller fills in live wait states.
jdk.ThreadStartjdk.ThreadEndjdk.JavaMonitorEnterjdk.JavaMonitorWaitjdk.ThreadParkjdk.VirtualThreadPinned
04Available

Wait-for graph analysis

Threads and locks become a graph. A cycle means every thread in it waits for the next — a deadlock. Cycles with a pinning edge are flagged as pinning deadlocks.
T1 holds A and waits for B; T2 holds B and waits for A: a deadlock cycleholdswaitsholdswaitsT1T2AB
  • thread
  • lock
  • holds
  • waits
  • deadlock cycle
05Available

CLI experience

dixy opens an interactive shell with tab completion. dixy detect scans non-interactively with JSON output and exit codes for scripts.
dixy
$ dixy
dixy> status
dixy> threads list
dixy> deadlocks detect
dixy> detect --json
Commands from cli/*.java
06Available

Diagnostic event collection

Threads, locks, wait edges and deadlock reports are stored in PostgreSQL and served over a REST API with API-key auth, plus Prometheus metrics.
bash
curl -H "X-API-Key: dixy-local-dev-key-123" \
http://localhost:8081/api/deadlocks

Architecture

From JVM event to deadlock report.

Hover or select a component to see its role and the source file behind it.

Full architecture

Target JVM

Collection

Processing

Detection

Output

Cycle detection

DeadlockDetectorAvailable

Depth-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.

dixyterminal

Open the interactive dixy> shell.

dixy detect --pid <pid>terminal

Attach the agent to a running JVM and scan every second.

dixy detect --jar <path> --jsonterminal

Same scan, machine-readable {"cycles":[...]} snapshots.

dixy <app-directory>terminal

Pick a runnable jar in the folder, start it with the agent, open the shell.

statusshell

Diagnostic status: HEALTHY / WARNING / CRITICAL.

deadlocks listshell

List the latest stored deadlock reports.

events listshell

Recent raw JVMTI events (LockOwned / LockReleased).

helpshell

List 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.

Manual diagnosis compared with DIXY's workflow
Task Ad-hoc manual With DIXY
Finding the deadlockSpot a hang, then take thread dumps at the right momentContinuous scan every second; alert as soon as a cycle exists
Reading the evidenceCross-reference lock addresses across many stack tracesPrints each edge: who holds which lock, who waits for it
Virtual threadsLook for pinning separately with JFR toolingjdk.VirtualThreadPinned feeds the same graph
AutomationAd-hoc scripts around dump toolsExit code 1 on deadlock, --json output
HistoryDumps saved wherever someone put themReports stored and queryable via CLI and REST

Make your Java applications easier to debug.

Open source, MIT licensed, and built on JVMTI and JFR.