Befehlszeilentools zum Ermitteln der Java-Heap-Größe

1. Übersicht

In diesem kurzen Tutorial lernen wir einige verschiedene Möglichkeiten kennen, um die Heap-Größe einer laufenden Java-Anwendung zu ermitteln.

2. jcmd

Um den Haufen und mLokal bezogenen Informationen einer laufenden Java - Anwendung zu finden, können wir die Verwendung jcmd Befehlszeilenprogramm :

jcmd GC.heap_info

Lassen Sie uns zunächst die Prozess-ID einer bestimmten Java-Anwendung mit dem Befehl jps ermitteln :

$ jps -l 73170 org.jetbrains.idea.maven.server.RemoteMavenServer36 4309 quarkus.jar 12070 sun.tools.jps.Jps

Wie oben gezeigt, lautet die Prozess-ID für unsere Quarkus-Anwendung 4309. Nachdem wir nun die Prozess-ID haben, sehen wir uns die Heap-Informationen an:

$ jcmd 4309 GC.heap_info 4309: garbage-first heap total 206848K, used 43061K region size 1024K, 43 young (44032K), 3 survivors (3072K) Metaspace used 12983K, capacity 13724K, committed 13824K, reserved 1060864K class space used 1599K, capacity 1740K, committed 1792K, reserved 1048576K

Diese App verwendet den G1- oder Garbage-First-GC-Algorithmus:

  • In der ersten Zeile wird die aktuelle Heap-Größe als 202 MB (206848 K) angegeben. Außerdem werden 42 MB (43061 K) verwendet
  • G1-Regionen sind 1 MB groß, es gibt 43 Regionen, die als jung markiert sind, und 3 Regionen als Überlebensraum
  • Die aktuelle Kapazität des Metaspaces liegt bei 13,5 MB (13724 K). Von diesen 13,5 MB werden ungefähr 12,5 MB (12983 K) verwendet. Wir können auch bis zu 1 GB Metaspace (1048576 K) haben. Darüber hinaus sind 13842 KB garantiert für die Verwendung durch die virtuelle Java-Maschine verfügbar, die auch als festgeschriebener Speicher bezeichnet wird
  • Die letzte Zeile zeigt, wie viel Metaspace zum Speichern von Klasseninformationen verwendet wird

Diese Ausgabe kann sich je nach GC-Algorithmus ändern . Wenn wir zum Beispiel dieselbe Quarkus-App mit ZGC über "-XX: + UnlockExperimentalVMOptions -XX: + UseZGC" ausführen :

ZHeap used 28M, capacity 200M, max capacity 1024M Metaspace used 21031K, capacity 21241K, committed 21504K, reserved 22528K

Wie oben gezeigt, verwenden wir 28 MB des Heaps und etwa 20 MB Metaspace. Zum jetzigen Zeitpunkt verwendet Intellij IDEA noch den CMS GC mit den folgenden Heap-Informationen:

par new generation total 613440K, used 114299K eden space 545344K, 18% used from space 68096K, 16% used to space 68096K, 0% used concurrent mark-sweep generation total 1415616K, used 213479K Metaspace used 423107K, capacity 439976K, committed 440416K, reserved 1429504K class space used 55889K, capacity 62488K, committed 62616K, reserved 1048576K

Wir können die klassische Generationsnatur des CMS GC in der Heap-Konfiguration erkennen.

3. jstat

Zusätzlich zu jcmd können wir jstat verwenden , um dieselben Informationen aus laufenden Anwendungen herauszufinden. Zum Beispiel können wir jstat -gc verwenden , um Heap-Statistiken anzuzeigen :

$ jstat -gc 4309 S0C S1C S0U S1U EC EU OC OU MC 0.0 0.0 0.0 0.0 129024.0 5120.0 75776.0 10134.6 20864.0 MU CCSC CCSU YGC YGCT FGC FGCT CGC CGCT GCTGCT 19946.2 2688.0 2355.0 2 0.007 1 0.020 0 0.000 0.027

Jede Spalte repräsentiert die Speicherkapazität oder Auslastung eines bestimmten Speicherbereichs:

  • S0C - Die Kapazität für den ersten Überlebensraum
  • S1C - Die Kapazität für den zweiten Überlebensraum
  • S0U - Der genutzte Raum des ersten Überlebenden
  • S1U - Der genutzte Raum des zweiten Überlebenden
  • EC - Eden Raumkapazität
  • EU - Nutzraum von Eden
  • OC - ​​Kapazität der alten Generation
  • OU - Nutzungsraum der alten Generation
  • MC - Metaspace-Kapazität
  • MU - Verwendeter Speicherplatz von Metaspace
  • CCSC - Komprimierte Klassenraumkapazität
  • CCSU - Verwendeter Speicherplatz für komprimierte Klassen
  • YGC - Die Anzahl der kleineren GCs
  • YGCT - Die Zeit, die für kleinere GCs aufgewendet wird
  • FGC - Die Anzahl der vollständigen GCs
  • FGCT - Die Zeit, die für vollständige GCs aufgewendet wird
  • CGC - Die Anzahl der gleichzeitigen GCs
  • CGCT - Zeit, die für gleichzeitige GCs aufgewendet wird
  • GCT - Die Zeit, die für alle GCs aufgewendet wurde

Es gibt andere speicherbezogene Optionen für jstat wie:

  • Die Fähigkeit , unterschiedliche Kapazitäten für unterschiedliche Speicherbereiche zu melden
  • Das -gcutil zeigt nur den Auslastungsprozentsatz jeder Region an
  • Die -gccause ist dieselbe wie -gcutil , fügt jedoch die Ursache des letzten GC und möglicherweise der aktuellen GC-Ereignisse hinzu

4. Befehlszeilenargumente

Wenn wir eine Java-Anwendung mit Heap-Konfigurationsoptionen ausführen (z. B. -Xms und -Xmx ), gibt es einige andere Tricks, um die angegebenen Werte zu finden.

So meldet jps beispielsweise diese Werte:

$ jps -lv 4309 quarkus.jar -Xms200m -Xmx1g

Mit diesem Ansatz können wir nur diese statischen Werte finden. Es gibt also keine Möglichkeit, beispielsweise den aktuell festgeschriebenen Speicher zu kennen .

Zusätzlich zu jps melden einige andere Tools dasselbe. Beispielsweise meldet die "jcmd VM.command_line" auch diese Details:

$ jcmd 4309 VM.command_line 4309: VM Arguments: jvm_args: -Xms200m -Xmx1g java_command: quarkus.jar java_class_path (initial): quarkus.jar Launcher Type: SUN_STANDARD

Außerdem können wir auf den meisten Unix-basierten Systemen ps aus dem procps- Paket verwenden:

$ ps -ef | grep quarkus ... java -Xms200m -Xmx1g -jar quarkus.jar

Schließlich können wir unter Linux das virtuelle Dateisystem / proc und seine PID-Dateien verwenden:

$ cat /proc/4309/cmdline java -Xms200m -Xmx1g -jar quarkus.jar

Die cmdline- Datei in einem Verzeichnis, das nach der Quarkus-PID benannt ist, enthält den Befehlszeileneintrag für die Anwendung.

5. Schlussfolgerung

In diesem kurzen Tutorial haben wir verschiedene Möglichkeiten gesehen, um die Heap-Größe einer laufenden Java-Anwendung zu ermitteln.