VisualVM nennt sich selbst ein visuelles Tool, das die JDK-Befehlszeilen-Tools und leichtgewichtige Profiling-Funktionen integriert. So integriert es zum Beispiel die JDK-Tools jconsole, jps, jinfo, jstack und jmap unter einer GUI und kann durch (selbst entwickelte) Plug-ins leicht erweitert werden. Dabei ist es sowohl für die Entwicklung als auch für den Einsatz in der Produktion konzipiert.
Durch seine GUI erlaubt VisualVM einfachen Zugriff auf Funktionalitäten, die sonst hinter Kommandozeilenparametern "versteckt" sind.
Und was hat dies mit Java 21 zu tun?
In der aktuellen Version 2.1.7 bietet VisualVM volle Unterstützung für Java 21 und ist damit eines der ersten Tools am Markt, die Java 21 vollumfänglich unterstützen.
Wie immer – die Installation
Mittlerweile ist VisualVM als eigenes Projekt bei GitHub [Down] zu finden. Lade es einmal herunter und starte es durch folgenden Aufruf:
bin/visualvm
beziehungsweise:
.\visualvm.exe
Der Startbildschirm
Direkt nach dem Start teilt sich der Bildschirm in verschiedene Bereiche. Prominent in der Mitte befindet sich eine Auswahl mit Hilfethemen zum Umgang mit VisualVM. Interessanterweise öffnet sich beim Klick auf die Einführung keine weitere Hilfeseite, sondern ein gut verständliches Video, das den Nutzer ziemlich schnell zu ersten Erfolgen führt.
Auf der linken Seite des Startbildschirms von VisualVM sehen wir alle gerade laufenden Java-Programme auf dieser Maschine – wie sie auch das JDK-Tool jps gezeigt hätte. Auch unser "Visual-VM", da ebenfalls in Java geschrieben, ist dabei.
Ein einfacher Doppelklick auf den Prozessnamen öffnet gleich vier Tabs zu Informationen zu dieser JVM. Direkt der erste Tab "Overview" zeigt eine Übersicht über die statischen Informationen der ausgewählten JVM. Hierzu zählen neben allgemeinen Dingen, wie Version der JVM oder Argumente, auch, mit welchen Parametern diese Virtuelle Maschine aufgerufen wurde. Wähle einmal in dem "Overview"-Tab den Punkt "System Properties" und du wirst staunen, was hier alles gesetzt ist. Näheres zu JVM-Parametern findest du übrigens in der Tool-Talk-Kolumne von JavaSPEKTRUM 4/22: "Die Java VM – unser liebstes Tool".
Der "Monitor"-Tab erinnert stark an die Ausgabe der jconsole (s. Abb. 1).
Abb. 1: Monitoring der JVM
Interessant wird es aber wieder, wenn man live grafisch sehen kann, welche Threads gerade laufen (s. Abb. 2).
Abb. 2: Die Threads innerhalb der JVM
Es geht tiefer – die Möglichkeit der verschiedenen Dumps
Durch Klick auf die rechte Maustaste bei einem Prozessnamen öffnet sich ein Kontextmenü, das die verschiedenen Möglichkeiten, diesen Prozess zu analysieren, offenbart.
Fangen wir einmal mit einem "Applications Snapshot" an – so sehen wir, dass, nachdem dieser gemacht wurde, der Snapshot ebenfalls links unten mit Zeitstempel auftaucht. Er konserviert quasi die Daten, die bei einem einfachen Aufruf wie oben beschrieben wegrollieren würden. Dabei ist es möglich, beliebig viele dieser Snapshots anzulegen, sodass man diese zu einem späteren Zeitpunkt nicht nur analysieren, sondern auch vergleichen kann.
Ähnlich verhält es sich hier mit Thread- und Heapdumps, die ebenso über dieses Kontextmenü erstellt werden können.
Ein paar Besonderheiten bei der Heapdump-Analyse
Erstellt man einen Heapdump und öffnet diesen, so zeigt sich die sicherlich aus anderen Tools bereits bekannte Übersicht über den Speicherauszug. Interessant ist aber, dass es möglich ist, durch Auswahl des Menüpunkts "Window" (s. Abb. 3) grafisch aufbereitete Informationen zu den GUI-Elementen einer grafischen Anwendung zu bekommen.
Abb. 3: Übersicht über den Heapdump
Ein weiteres interessantes Feature ist, dass VisualVM durch Auswahl des Punkts "OQL Console" eine eigene Konsole zur Auswertung des Heapdumps mitbringt und nicht wie beim JDK-Tool jhat einen eigenen Webserver startet, der dann eine Webapplikation zur Analyse bereitstellt.
Die Plug-ins
Es führt sicherlich zu weit, in diesem Artikel alle Features von VisualVM zu präsentieren, vor allem aber auch deshalb, weil diese VM Plug-ins unterstützt. Um zu sehen, welche Plug-ins verfügbar sind, wählt man einfach "Tools-Plugins".
Im Weiteren möchte ich einmal exemplarisch ein recht interessantes Plug-in vorstellen.
Der grafische Obermüllmann – Visual GC
Sei mal ehrlich – wann hast du dich das letzte Mal ernsthaft um deinen Garbage Collector (GC) gekümmert? Warum nicht? Doch wahrscheinlich, weil er so unauffällig seine Arbeit im Hintergrund erledigt. Das ändert sich mit dem Plug-in "Visual GC", das dir live zeigt, wie das Aufräumen innerhalb deiner VM vonstattengeht (s. Abb. 4).
Abb. 4: Die Aktivitäten des Garbage Collectors
Plug-ins deaktivieren
Plug-ins, die gerade nicht benötigt werden, müssen nicht deinstalliert werden, sondern lassen sich einfach deaktivieren. Diese werden dann beim Start nicht geladen – der Start erfolgt somit schneller und die Anwendung benötigt weniger Speicher, was gerade bei der Analyse von Live-Systemen interessant sein kann. Benötigt man das Plugin dann zu einem späteren Zeitpunkt, kann es einfach wieder aktiviert werden – auch ohne eine Internetverbindung!
Eigene Plug-ins
Das Erstellen von eigenen Plugins ist sicherlich ein weiteres interessantes Thema, allerdings würde dies den Rahmen dieses Artikels sprengen. Interessierte finden jedoch hier [VMP] alles, was sie wissen müssen.
Fazit
Vieles kommt einem bekannt vor – allerdings sind die Funktionalitäten immer in verschiedensten Tools verstreut. VisualVM schafft es, diese zusammen zu bringen, ohne dass eine große Installation notwendig ist. Durch die Möglichkeit, Plug-ins hinzuzufügen und auch eigene zu schreiben, lassen sich Tools integrieren, ohne sich um die Basis-Analysemöglichkeiten kümmern zu müssen.
Einen hab ich noch …
Auch wenn dies nicht VisualVM, sondern eher das ganze JDK betrifft: Für alle, die es noch nicht mitbekommen haben: Das 32-Bit Windows JDK ist als deprecated markiert (JEP 449). Wundert euch also nicht, wenn ihr keine 32-Bit Version findet!
Weitere Informationen
[Down] https://visualvm.github.io/
[VMP] https://raw.githubusercontent.com/visualvm/visualvm.java.net.backup/master/www/api-quickstart.html