Skip to main content
The JVM probe reads live state from any running Java Virtual Machine process by loading a native JVMTI agent through the standard JVM Attach API — the same mechanism used by production profilers such as YourKit and JProfiler. Once attached, it uses JNI reflection to enumerate loaded classes, read field values, and invoke methods on live Java objects. You do not need to modify the application, add an agent JAR to the JVM startup arguments, or have access to any source code.

How JVMTI Attachment Works

The JVM Attach API (com.sun.tools.attach.VirtualMachine) is part of the standard JDK tooling. NSP’s daemon calls it at runtime to load the JVMTI agent into the target JVM without pausing or restarting the process:
All field reads and method invocations execute on a JVM thread inside the target’s own thread pool. The target JVM is never paused — unlike heap dump approaches that require a stop-the-world phase.

Schema Learning

On first attachment, the probe performs a cold probe that walks all loaded classes, identifies state-bearing fields by type and naming convention, and builds a schema that is persisted in the local SQLite registry. Schema learning includes:
  • Mapping Java class names and field names to SSF dot-notation keys
  • Detecting collections (lists, maps, arrays) and inferring element types
  • Scoring fields by semantic relevance (discarding JVM internals and synthetic fields)
  • Queuing unrecognized objects for LLM-assisted label enrichment
After the schema is cached, subsequent polls skip the class enumeration step and go straight to targeted field reads, reducing per-cycle latency to 20–100ms.
Cold probe time for JVM applications is typically 10–60 seconds, depending on the number of loaded classes and the complexity of the application’s data model. You will see probe_status: "cold_probe" in AppSummary during this phase.

Supported Applications

The following applications have validated entries in the app signature database. Any Spring Boot or standard Java desktop application is also supported via field and method introspection, even without a pre-built signature.

Confidence Baseline

The JVM probe achieves consistently high confidence because the JVM retains full reflection metadata at runtime — class names, field names, and type signatures are always available, even in production builds. These confidence values unlock the following action tiers:

Reading State via the Python SDK

Access the live Java object graph through the standard state API or through the JVM-specific session proxy:

Invoking Java Methods

The JVM probe can invoke methods on live Java objects with full type coercion. Python types are automatically mapped to the correct JVM types at the call site:

Type Coercion Reference


No Agent JAR or Source Code Required

NSP’s JVMTI integration is fully self-contained. The daemon loads axon_jvmti_agent.jar into the target process at runtime via the Attach API. You do not need to:
  • Add any JAR to the application’s classpath or startup arguments
  • Modify the application’s launch script or container entrypoint
  • Provide source code, bytecode, or build artifacts
  • Restart the JVM
The JVMTI Attach API requires that the target JVM was launched by the same OS user as axon-daemon, or that axon-daemon is running with elevated privileges. On Linux, this typically means running the daemon as the same user that launched the Java application.

Error Reference

Yes. Any Spring Boot application running in a standard JVM is supported. The probe enumerates Spring bean types via JVMTI and reads their field values through JNI reflection. For web services, state includes request context objects and in-flight bean state.
If the application was compiled with ProGuard or R8, class and field names may be minified (e.g. a.b.c). The cold probe queues these for LLM-assisted label enrichment, which maps the obfuscated names to semantic labels based on field types and values. Confidence will be lower (0.70–0.85) until enrichment completes.
Yes. Each JVM process receives its own app_id and independent probe lifecycle. If multiple JVMs are running on the same host (e.g. a Jenkins controller and agent), each is tracked and probed independently.