Argus JVM Observability Platform
A lightweight JVM observability platform that helps you understand what your Java application is doing — right now, in production.
Argus gives you two tools for JVM diagnostics:
- Argus CLI — 50 diagnostic commands that work on any running JVM. No agent, no restart, no configuration. Point at a PID and get answers in seconds.
- Argus Agent — Attach as a Java agent and get a live web dashboard with GC timelines, CPU graphs, heap usage, flame graphs, and thread analysis, all streaming in real time.
Philosophy: Argus is not an APM. It's a diagnostic tool designed for the moments when you need to look inside a JVM and understand what's happening — quickly, without setup overhead, without external dependencies.
Why Argus?
Every Java developer has been there. Your application is running in production, and something is wrong. Response times are climbing. Memory usage is creeping up. The GC is pausing more often than it should. You know something is happening inside the JVM, but you can't see it.
Traditional monitoring tools tell you that your app is slow, but they don't tell you why. APM solutions are expensive and heavy. JMX is clunky. JFR dumps require post-processing. By the time you've gathered the data, the incident is over.
Argus was built to solve this problem.
Instant CLI Diagnostics
50 commands that work on any running JVM. No agent, no restart, no configuration. Just point at a PID and get answers in seconds.
Real-time Dashboard
Attach as a Java agent and get a live web dashboard with GC timelines, CPU graphs, heap usage, flame graphs, and thread analysis — all streaming in real time.
Virtual Thread Aware
First-class support for Java 21 virtual threads. Detect pinning, analyze carrier thread distribution, and monitor thread lifecycle events as they happen.
Zero Overhead Design
Built on JFR and JMX MXBeans — the same low-overhead infrastructure that the JVM uses internally. No bytecode modification, no sampling bias.
Installation
One command. Takes about 10 seconds.
curl -fsSL https://raw.githubusercontent.com/rlaope/argus/master/install.sh | bash
This downloads the Argus CLI to ~/.argus/ and adds it to your PATH. After installation, type argus with no arguments to see all available commands.
CLI Commands
The CLI is a standalone tool that works on any running JVM process. You don't need to have started the application with any special flags. You don't need to install an agent. If you can see the process in jps, Argus can diagnose it.
Your First Diagnosis
Let's say you have a Java application that's behaving strangely. Here's how you'd investigate:
# Step 1: Find your application's PID
argus ps
# Step 2: Get an overview of the JVM
argus info 12345
# Step 3: Check GC behavior — is the GC working too hard?
argus gc 12345
# Step 4: Look at memory — is something leaking?
argus heap 12345
# Step 5: Check threads — are there too many? Any deadlocked?
argus threads 12345
argus deadlock 12345
# Step 6: If memory is the issue, find what's consuming it
argus histo 12345
Argus CLI in action — diagnosing a running JVM process
All 50 Commands
Every command follows the same pattern: argus <command> <pid>. All commands support --format=json for scripting and --source=auto|agent|jdk to control the data source.
| Category | Commands | What they tell you |
|---|---|---|
| Process | ps, info, init | Find and identify JVM processes |
| Memory | heap, histo, heapdump, diff, nmt | Heap usage, object distribution, native memory |
| GC | gc, gcutil, gccause, gcnew | GC frequency, pause times, causes, generation stats |
| Threads | threads, deadlock, pool | Thread states, deadlocks, pool analysis |
| CPU | profile, jfr | CPU profiling, flight recording |
| Classes | classloader, classstat, stringtable, symboltable | Class loading, interned strings, symbols |
| Runtime | sysprops, vmflag, vmset, vmlog, env, dynlibs | Configuration, flags, environment |
| Advanced | metaspace, compiler, finalizer, jmx, report, top | Metaspace, JIT, finalizers, diagnostics |
Dashboard
While the CLI is great for quick checks, sometimes you need to watch what's happening over time. That's where the Argus Agent comes in. Attach it to your JVM, and you get a real-time web dashboard that shows you everything.
Starting the Dashboard
Add the -javaagent flag when starting your application:
java -javaagent:argus-agent.jar \
-Dargus.gc.enabled=true \
-Dargus.cpu.enabled=true \
-Dargus.allocation.enabled=true \
-jar your-application.jar
Open http://localhost:9202/ in your browser and you'll see the dashboard immediately. No configuration files, no external services, no database.
Argus Dashboard — real-time JVM monitoring with GC, CPU, memory, and thread analysis
What the Dashboard Shows
The dashboard is organized in a JVM-health-first layout. When you're responding to an incident, you look at the most critical metrics first:
Memory & GC
Heap usage over time, GC pause timeline, GC cause distribution, overhead percentage. See immediately if GC is your bottleneck.
CPU Utilization
JVM and system CPU load plotted over the last 60 seconds. Spot CPU spikes and correlate them with GC pauses.
Allocation & Metaspace
Object allocation rate, peak rate, top allocating classes, metaspace growth rate. Detect memory pressure before it becomes an OOM.
Profiling & Contention
CPU hot methods, lock contention hotspots, interactive flame graph. Find exactly which code paths are consuming resources.
Virtual Threads
Thread creation rate, active count, pinning detection with stack traces, carrier thread distribution. Java 21+ only.
Recommendations
Auto-generated insights from cross-correlating GC, CPU, memory, and thread metrics. The dashboard tells you what to investigate.
Interactive Console
The dashboard includes an interactive console at /console.html where you can run diagnostic commands directly in the browser. Click a command button, watch the typing animation, and see the results — all without leaving the dashboard.
Configuration Options
Production tip: Start with just gc and cpu enabled. These have negligible overhead. Enable allocation, profiling, and contention only when actively investigating — they generate more JFR events and use more memory.
| Property | Default | Description |
|---|---|---|
argus.server.port | 9202 | Dashboard HTTP port |
argus.gc.enabled | true | GC event collection |
argus.cpu.enabled | true | CPU load sampling |
argus.allocation.enabled | false | Object allocation tracking (higher overhead) |
argus.profiling.enabled | false | CPU method profiling (higher overhead) |
argus.contention.enabled | false | Lock contention monitoring |
argus.metaspace.enabled | true | Metaspace usage tracking |
argus.metrics.prometheus.enabled | true | Prometheus metrics endpoint at /prometheus |
Spring Boot Integration
If you're building a Spring Boot application (3.2+), you don't need to use the -javaagent flag at all. Just add a single dependency and Argus starts automatically with your application.
Setup
// build.gradle.kts
implementation("io.argus:argus-spring-boot-starter:0.8.0")
When your Spring Boot application starts, Argus will:
- Start the JFR streaming engine automatically
- Launch the dashboard on port 9202
- Register with Spring Boot Actuator at
/actuator/health/argus - Export ~25 Micrometer metrics to your configured backend (Prometheus, Datadog, etc.)
Configuration via application.yml
argus:
buffer-size: 131072
server:
port: 9202
gc:
enabled: true
cpu:
enabled: true
interval-ms: 500
allocation:
enabled: true
threshold: 524288
All properties have IDE autocomplete support. The defaults match the standard agent configuration.
Micrometer Metrics
When Micrometer is on the classpath (it is in most Spring Boot apps), Argus automatically registers ~25 JVM diagnostic metrics:
# Example Prometheus queries
argus_heap_used_bytes # Current heap usage
argus_gc_pause_time_max_seconds # Worst GC pause
argus_cpu_jvm_user_ratio * 100 # JVM CPU %
argus_virtual_threads_active # Active virtual threads
argus_allocation_rate_bytes_per_second # Allocation pressure
Framework-agnostic: The argus-micrometer module works without Spring. If you're using Quarkus, Micronaut, or standalone Micrometer, add argus-micrometer directly and register the ArgusMeterBinder with your MeterRegistry.
Java Version Compatibility
Argus adapts its capabilities based on the Java version at runtime. You don't need to configure anything — it detects the version automatically and enables what's available.
| Feature | Java 11+ | Java 17+ | Java 21+ |
|---|---|---|---|
| CLI (50 commands) | Yes | Yes | Yes |
| Dashboard & Web UI | — | Yes (MXBean) | Yes (JFR) |
| GC / CPU / Memory | CLI only | Yes | Yes |
| Allocation Tracking | — | — | Yes |
| Virtual Threads | — | — | Yes |
| Flame Graph | — | — | Yes |
| Lock Contention | — | — | Yes |
| Spring Boot Starter | — | Yes | Yes |
| Micrometer Metrics | — | Yes | Yes |
How it works: On Java 17–20, the agent uses an MXBean polling engine that queries ManagementFactory MXBeans for GC, CPU, and memory data at regular intervals. On Java 21+, it uses JFR streaming for lower overhead and richer event data. The dashboard automatically hides features that aren't available on your Java version.
Architecture
Argus is organized into seven modules, each with a clear responsibility:
| Module | Purpose |
|---|---|
argus-core | Shared event types, configuration, ring buffer transport |
argus-agent | Java agent entry point, JFR streaming engine, MXBean polling engine |
argus-server | Netty HTTP/WebSocket server, 10 analyzers, metrics export |
argus-frontend | Dashboard web UI (vanilla JS, Chart.js, D3 flame graph) |
argus-cli | 50 diagnostic commands using jcmd/jstat |
argus-micrometer | Framework-agnostic Micrometer MeterBinder |
argus-spring-boot-starter | Spring Boot auto-configuration |
The agent and server communicate through lock-free ring buffers in shared memory — there is no network protocol between them. This means zero serialization overhead and minimal latency from event capture to dashboard display.
Configuration Reference
All Argus properties can be set as JVM system properties (-Dargus.xxx=value) when using the agent, or in application.yml / application.properties when using the Spring Boot starter.
Agent Properties
| Property | Default | Description |
|---|---|---|
argus.server.port | 9202 | Dashboard HTTP port |
argus.gc.enabled | true | GC event collection via JFR |
argus.cpu.enabled | true | CPU load sampling |
argus.cpu.interval-ms | 500 | CPU sampling interval in milliseconds |
argus.allocation.enabled | false | Object allocation tracking (higher overhead) |
argus.allocation.threshold | 524288 | Minimum allocation size to track (bytes) |
argus.profiling.enabled | false | CPU method profiling via JFR |
argus.contention.enabled | false | Lock contention monitoring |
argus.metaspace.enabled | true | Metaspace usage tracking |
argus.buffer-size | 131072 | Ring buffer size in bytes |
argus.metrics.prometheus.enabled | true | Expose Prometheus endpoint at /prometheus |
CLI Flags
| Flag | Values | Description |
|---|---|---|
--format | text, json | Output format (default: text) |
--source | auto, agent, jdk | Data source selection (default: auto) |