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:
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
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 standardstate API or through the JVM-specific session proxy:
- Standard State API
- JVM 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 loadsaxon_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
Does the JVM probe work with Spring Boot services?
Does the JVM probe work with Spring Boot services?
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.
What happens with obfuscated JARs?
What happens with obfuscated JARs?
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.Does the JVM probe support multi-JVM environments?
Does the JVM probe support multi-JVM environments?
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.