Skip to content

Internals

Architecture Overview

How events travel from your JVM through the agent, the wait-for graph and the detector to the CLI and API.

The pipeline

  1. The agent loads inside the target JVM (VirtualDeadlockAgent).
  2. JVMTI, JFR and a thread-state poller produce lock and thread events.
  3. EventSender sends each event to the in-process GraphGateway and to the backend.
  4. The gateway updates a WaitForGraph and runs DeadlockDetector.
  5. Cycles are pushed to /api/internal/deadlocks; the CLI and REST API read them.

See the interactive diagram on the Architecture page.

Two destinations per event

Every event goes to the local gateway, so detection happens immediately inside the target JVM, and fire-and-forget over HTTP to the backend, which persists telemetry for the shell. A network failure never breaks the instrumented application.

Source modules

PackageRole
LockDetectionAgent/-javaagent: JVMTI bridge, JFR listener, poller, event sender
graph/Registries, WaitForGraph, detectors, report generator
backend/REST controllers, services, persistence, API-key security
cli/Spring Shell commands and the dixy detect runner
native/C++ JVMTI agent