# jvm-mon: a Go binary that attaches a Java agent to a running JVM

> jvm-mon answers one question: what is this JVM doing right now, over SSH, in a terminal. The Go rewrite ships as a single executable with a bundled agent jar that it extracts and attaches at runtime, and the project publishes no version after 1.3 from 2025-03-28.

**ajermakovics/jvm-mon** — Console-based JVM monitoring tool

- Repository: https://github.com/ajermakovics/jvm-mon
- Website: https://ajermakovics.github.io/jvm-mon/
- Stars: 1,487 · Forks: 119
- Language: Go
- License: NOASSERTION
- Published: 2026-10-16 · Updated: 2026-10-16 · Language: en
- Canonical page: https://hysenlabs.com/projects/ajermakovics-jvm-mon

## It attaches to a running JVM instead of wrapping the launch

The design decision that explains everything else is that jvm-mon connects to a process that is already up. There is no wrapper script, no application startup hook, no JMX URL to configure. You launch the tool, it finds JVM processes on the machine, and you pick one. The README describes the sequence for the current version: the executable comes bundled with a Java agent jar, extracts the agent to a temp directory on startup, attaches to the JVM you want to monitor, loads the agent into that running JVM to collect metrics, and the agent and application then hold a socket connection to carry those metrics back. So the tool is a client to your own agent, not a resident collector wired into your build.

## The Go rewrite removed the JDK requirement

Release 1.3 is the pivot, and the README lists its consequences plainly: rewritten in Go, delivered as a single executable file, able to monitor applications on Java 8 and above, and requiring no existing JDK. That last point is the practical win on a locked down production host where a JDK may be absent but a JVM is nonetheless running, for instance a bundled runtime inside an application image. The cost is that the collector logic and the UI moved language, so the previous behaviour is not preserved automatically across the boundary, and the build from source instructions moved into the jvm-mon-go directory with its own readme. The repository reflects that split: the top level holds the README and the jvm-mon-go directory rather than a single source tree.

## Installing means brew on a Mac or a release download anywhere

There is no package repository for Linux and no documented apt or rpm path. The README points at the latest release page for a binary, and gives one package manager line for macOS:

```shell
brew install jvm-mon
```

On a Linux server the path is the release asset. That is the whole install story, and it is short because the executable carries the agent jar inside itself. One thing worth checking on your own host before you reach for it: the agent is extracted to a temp directory at startup, so the tool needs write access to a temp location on the machine you are monitoring, and it needs permission to attach to another user's process.

## Four panels, and none of them persist

The README's list of what is available is short enough to reproduce: a list of running JVM processes, CPU and GC load, heap size and usage, and the top threads by CPU usage. That is a snapshot of a live process, presented in a terminal, with no time series and no way to look at what happened ten minutes ago unless the terminal scrollback holds it. For a triage tool reached over SSH after a page, that is exactly the right scope. For anything you need to correlate against a deploy an hour ago or to alert on, the feature set stops before you start. The project is explicit that it is for the case where you just want to SSH into a server and see what is going on.

## Del kills the process from the same list you are browsing

The key bindings deserve a line of their own, because one of them is dangerous. Enter selects a JVM and starts monitoring it. q or Ctrl+C exits. Del or Backspace kills a process. That third binding operates on the very list you were scanning a moment earlier, so a stray keypress on a production host removes the process from the machine while you were only trying to look at it. There is no confirmation step documented and no mention of a read only mode. If you roll this tool out to a server, decide in advance who gets to use it, or wrap it so the kill path is not reachable.

## Metrics travel over a socket between agent and application

The transport detail matters if you plan to extend anything. The agent lives inside the JVM being watched and the application process it runs in talk over a socket connection to send metrics. That makes the boundary between collection and display clean, and it means the Go side is a viewer rather than a second source of instrumentation. It also means the agent is real code injected into a live process, which is a decision your change management process may want to see written down, along with the fact that it is extracted to a temp directory each time the tool starts.

## Against running the agent inside your own monitoring pipeline

The alternative is to keep the Java agent jar as the only piece you take from this project and feed it into the metrics path you already run, rather than using the bundled viewer. The difference in approach is where the display lives. jvm-mon gives you a zero infrastructure, zero configuration terminal panel that appears when you ssh in and disappears when you leave. A pipeline gives you history, retention and alerting, and costs you the agent, an exporter and somewhere to store the series. The other alternative is to rely on whatever diagnostic tooling the JVM runtime itself gives you, in which case the README's claim that no JDK is required is the argument for jvm-mon: it matters precisely on hosts where the JDK and its tools are absent. Decide from that, not from a feature checklist.

## Licence and release cadence need reading before adoption

Two facts belong in any evaluation. First, GitHub does not classify the licence as a standard one, and the repository carries a LICENSE.txt rather than a recognised licence identifier, so read that file directly before shipping the binary internally. Second, the release history stops: versions 1.1, 1.2 and 1.3 were published in March 2025, with 1.3 dated 2025-03-28, while the last push to the repository was on 2026-10-04. Work has continued on the code without new tagged releases, so a pinned binary will not pick up later commits.

## Conclusion

jvm-mon earns a place on a server where someone already logs in with SSH and nobody wants to stand up a metrics pipeline before looking at a JVM. It suits Java 8 and above and stops there: the panel list is CPU and GC load, heap, and top threads by CPU, with no persistence, no history and no alerting. Before adopting, read LICENSE.txt, because GitHub cannot classify the licence and that file, not the README, is what governs use. And decide who is allowed to press Del in the process list, since that key kills the process you are looking at. The last push was on 2026-10-04, the newest release is 1.3 from 2025-03-28, and the repository is not archived.

## FAQ

### Does jvm-mon need a JDK installed on the host?

No. The README for release 1.3 states it does not require an existing JDK, and that it can monitor applications on Java 8 and above. The Go executable bundles the Java agent jar and extracts it to a temp directory at startup.

### How do I install jvm-mon on Linux?

The README only gives a package manager command for macOS, brew install jvm-mon, and otherwise points at the latest release page for a download. Building from source is documented in the readme inside the jvm-mon-go directory.

### Which metrics does the jvm-mon console show?

The README lists the list of running JVM processes, CPU and GC load, heap size and usage, and the top threads by CPU usage.

## Sources

- [ajermakovics/jvm-mon on GitHub](https://github.com/ajermakovics/jvm-mon)
- [Issues](https://github.com/ajermakovics/jvm-mon/issues)
- [Project website](https://ajermakovics.github.io/jvm-mon/)
- [README](https://github.com/ajermakovics/jvm-mon/blob/main/README.md)
- [Releases](https://github.com/ajermakovics/jvm-mon/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/ajermakovics-jvm-mon
