Skip to main content

JVM

The following inspections are based on the JVM metrics automatically collected by coroot-node-agent for each JVM running on the node. No configuration is needed for basic JVM monitoring.

Checks

  • JVM availability: checks that every JVM is up and running
  • JVM safepoints: detects situations when a Java application has been stopped for a significant amount of time due to safepoint operations

Charts

The JVM report includes the following chart groups:

  • Heap size: current heap usage and maximum heap size (-Xmx) per JVM instance
  • GC time: time spent in garbage collection, broken down by collector
  • Safepoint time: time the application is paused for safepoint operations
JVM

When async-profiler is enabled, two additional chart groups appear:

  • Allocation rate: bytes/second and objects/second allocated per JVM instance. Each chart links to the memory allocation profile for deeper analysis.
  • Lock contention: contentions/second and lock wait delay per JVM instance. Each chart links to the lock contention profile.
JVM with async-profiler

eBPF-based CPU profiling for Java

Coroot uses eBPF to capture CPU profiles at the kernel level with minimal overhead. However, because the JVM relies heavily on JIT compilation, the generated native code does not include symbolic information by default. To make the profiles readable, the JVM needs to expose symbol information via jcmd <pid> Compiler.perfmap.

Coroot automates this step by periodically calling jcmd in the background. However, the JVM must be started with the -XX:+PreserveFramePointer option. This allows for accurate stack traces and proper symbolization of JIT-compiled code, with only a small performance overhead (typically around 1-3%).

async-profiler for Java

For richer Java profiling (CPU without PreserveFramePointer, memory allocations, and lock contention), see Java profiling with async-profiler.

Looking for 24/7 support from the Coroot team? Subscribe to Coroot Enterprise:Start free trial