Strumenti della riga di comando per trovare la dimensione dell'heap Java

1. Panoramica

In questo breve tutorial, acquisiremo familiarità con alcuni modi diversi per ottenere la dimensione dell'heap di un'applicazione Java in esecuzione.

2. jcmd

Per trovare le informazioni relative all'heap e al metaspace di un'applicazione Java in esecuzione, possiamo utilizzare l' utilità della riga di comando jcmd :

jcmd GC.heap_info

Innanzitutto, troviamo l'ID di processo di una particolare applicazione Java utilizzando il comando jps :

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

Come mostrato sopra, l'ID di processo per la nostra applicazione Quarkus è 4309. Ora che abbiamo l'ID di processo, vediamo le informazioni sull'heap:

$ 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

Questa app utilizza l'algoritmo GC G1 o garbage-first:

  • La prima riga riporta la dimensione heap corrente di 202 MB (206848 K) - inoltre, vengono utilizzati 42 MB (43061 K)
  • Le regioni G1 misurano 1 MB, ci sono 43 regioni contrassegnate come giovani e 3 come spazio per i sopravvissuti
  • La capacità corrente del metaspace è di circa 13,5 MB (13724 K). Da quei 13,5 MB, vengono utilizzati circa 12,5 MB (12983 K). Inoltre, possiamo avere fino a 1 GB di metaspace (1048576 K). Inoltre, 13842 KB garantiti per essere disponibili per l'uso dalla macchina virtuale Java, nota anche come memoria impegnata
  • L'ultima riga mostra la quantità di metaspace utilizzata per memorizzare le informazioni sulla classe

Questo output può cambiare a seconda dell'algoritmo GC . Ad esempio, se eseguiamo la stessa app Quarkus con ZGC tramite "-XX: + UnlockExperimentalVMOptions -XX: + UseZGC" :

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

Come mostrato sopra, stiamo usando 28 MB di heap e circa 20 MB di metaspace. Al momento della stesura di questo documento, Intellij IDEA sta ancora utilizzando il CMS GC con le seguenti informazioni sull'heap:

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

Possiamo individuare la classica natura generazionale del CMS GC nella configurazione heap.

3. jstat

Oltre a jcmd , possiamo usare jstat per trovare le stesse informazioni dalle applicazioni in esecuzione. Ad esempio, possiamo usare jstat -gc per vedere le statistiche dell'heap:

$ 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

Ogni colonna rappresenta la capacità di memoria o l'utilizzo di un'area di memoria specifica:

  • S0C - La capacità del primo spazio sopravvissuto
  • S1C - La capacità per il secondo spazio sopravvissuto
  • S0U - Lo spazio utilizzato del primo sopravvissuto
  • S1U - Lo spazio utilizzato del secondo sopravvissuto
  • EC - Capacità dello spazio Eden
  • EU - Spazio usato dall'Eden
  • OC - ​​Capacità di vecchia generazione
  • OU - Spazio utilizzato dalla vecchia generazione
  • MC - Capacità Metaspace
  • MU - Spazio utilizzato da Metaspace
  • CCSC - Capacità di spazio di classe compressa
  • CCSU: spazio utilizzato per le classi compresse
  • YGC - Il numero di GC minori
  • YGCT: il tempo impiegato per i GC minori
  • FGC: il numero di GC completi
  • FGCT: il tempo impiegato per i GC completi
  • CGC: il numero di GC simultanei
  • CGCT: tempo speso su GC simultanei
  • GCT: il tempo impiegato per tutti i GC

Esistono altre opzioni relative alla memoria per jstat come:

  • Il -gccapacity per segnalare le capacità diverse per le diverse aree di memoria
  • L' -gcutil mostra solo la percentuale di utilizzo di ogni regione
  • -Gccause è uguale a -gcutil ma aggiunge la causa dell'ultimo GC e possibilmente degli eventi GC correnti

4. Argomenti della riga di comando

If we run a Java application with heap configuration options (for example, -Xms and -Xmx), then there a few other tricks to find the specified values.

For instance, here's how jps reports those values:

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

With this approach, we can only find these static values. So, there is no way to know about, say, the current committed memory.

In addition to jps, a few other tools will report the same thing. For example, the “jcmd VM.command_line” will also report these 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

Also, on most Unix-based systems we can use ps from the procps package:

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

Infine, su Linux, possiamo usare il filesystem virtuale / proc e i suoi file pid:

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

Il file cmdline , in una directory che prende il nome dal pid Quarkus, contiene la voce della riga di comando per l'applicazione.

5. conclusione

In questo breve tutorial, abbiamo visto diversi modi per ottenere la dimensione dell'heap di un'applicazione Java in esecuzione.