OpenProfiler
Open-source JVM profiler. CPU, allocations, heap dumps, locks and live attach, from a native Rust agent to a flame graph in your browser.
OpenProfiler finds where your Java application spends CPU time, what it allocates, what holds on to memory and where threads wait on each other. It works on running JVMs (local, remote, in Docker or Kubernetes) and on saved files: .jfr recordings, .hprof heap dumps and its own .opsnap snapshots.
Under the hood: a native JVMTI agent, analysis engines, a daemon and a CLI, all in Rust. The UI is React, served in a browser or as a Tauri desktop app.
AsyncGetCallTrace on Linux.java.util.concurrent contention with lock owners, virtual threads.--fail-if "cpu.total > +10%".Install
Works on macOS and Linux (amd64, arm64):
brew install matusso/tap/openprofiler
brew upgrade openprofiler # later, to get the newest releaseDownloads
release v0.1.0 · verify with SHA256SUMS · all releases →
Usage
Analyse a file
openprofiler open recording.jfr # summary
openprofiler hotspots recording.jfr --kind alloc # top allocation sites
openprofiler analyze heap.hprof # build the heap index, print insights
openprofiler daemon --web heap.hprof # explore it in the UIProfile a running JVM
openprofiler list # local JVMs
openprofiler attach <pid> --duration 10s # live hot spots in the terminal
openprofiler record --pid <pid> --duration 60s -o app.opsnap
openprofiler record --pid <pid> --heap -o app.opsnap # ... with a heap dump at the end
openprofiler dump <pid> -o heap.hprof # heap dump onlyOr start the JVM with the agent:
java -agentpath:/path/to/libopenprofiler_agent.so=port=0 -jar app.jarCompare, export and gate in CI
openprofiler compare base.opsnap head.opsnap --fail-if "cpu.total > +10%" # exit 1 on regression
openprofiler export app.opsnap --view flame --format svg -o flame.svg # csv|json|html|svg|collapsedLet an AI agent profile for you
openprofiler mcp # MCP server on stdioTools include list_jvms, attach, hotspots, heap_dump, insights, compare and thread_dump.