Outils de ligne de commande pour trouver la taille du tas Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons nous familiariser avec plusieurs façons d'obtenir la taille du tas d'une application Java en cours d'exécution.

2. jcmd

Pour trouver les informations relatives au tas et à la méta-espace d'une application Java en cours d'exécution, nous pouvons utiliser l' utilitaire de ligne de commande jcmd :

jcmd GC.heap_info

Tout d'abord, trouvons l'ID de processus d'une application Java particulière à l'aide de la commande jps :

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

Comme indiqué ci-dessus, l'ID de processus de notre application Quarkus est 4309. Maintenant que nous avons l'ID de processus, voyons les informations du tas:

$ 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

Cette application utilise l'algorithme GC G1 ou garbage-first:

  • La première ligne indique que la taille actuelle du tas est de 202 Mo (206848 K) - également, 42 Mo (43061 K) sont utilisés
  • Les régions G1 font 1 Mo, il y a 43 régions marquées comme jeunes et 3 comme espace de survivants
  • La capacité actuelle du méta-espace est d'environ 13,5 Mo (13724 K). À partir de ces 13,5 Mo, environ 12,5 Mo (12983 K) sont utilisés. En outre, nous pouvons avoir jusqu'à 1 Go de méta-espace (1048576 K). De plus, 13842 Ko sont garantis disponibles pour une utilisation par la machine virtuelle Java, également appelée mémoire engagée
  • La dernière ligne montre combien de méta-espace est utilisé pour stocker les informations de classe

Cette sortie peut changer en fonction de l'algorithme GC . Par exemple, si nous exécutons la même application Quarkus avec ZGC via «-XX: + UnlockExperimentalVMOptions -XX: + UseZGC» :

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

Comme indiqué ci-dessus, nous utilisons 28 Mo de tas et environ 20 Mo de méta-espace. Au moment d'écrire ces lignes, Intellij IDEA utilise toujours le GC CMS avec les informations de tas suivantes:

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

Nous pouvons repérer la nature générationnelle classique du GC CMS dans la configuration du tas.

3. jstat

En plus de jcmd , nous pouvons utiliser jstat pour trouver les mêmes informations à partir des applications en cours d'exécution. Par exemple, nous pouvons utiliser jstat -gc pour voir les statistiques du tas:

$ 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

Chaque colonne représente la capacité de mémoire ou l'utilisation d'une zone de mémoire spécifique:

  • S0C - La capacité du premier espace survivant
  • S1C - La capacité du deuxième espace survivant
  • S0U - L'espace utilisé du premier survivant
  • S1U - L'espace utilisé du deuxième survivant
  • EC - Capacité spatiale Eden
  • EU - Espace utilisé d'Eden
  • OC - ​​Capacité de l'ancienne génération
  • OU - Espace utilisé de l'ancienne génération
  • MC - Capacité Metaspace
  • MU - Espace utilisé de Metaspace
  • CCSC - Capacité d'espace de classe compressée
  • CCSU - Espace utilisé pour les classes compressées
  • YGC - Le nombre de GC mineurs
  • YGCT - Le temps passé pour les GC mineurs
  • FGC - Le nombre de GC complets
  • FGCT - Le temps passé pour les GC complets
  • CGC - Le nombre de GC simultanés
  • CGCT - Temps passé sur les GC simultanés
  • GCT - Le temps passé pour tous les GC

Il existe d'autres options liées à la mémoire pour jstat telles que:

  • Le -gccapacity de signaler différentes capacités pour les différentes régions de mémoire
  • Le -gcutil montre que le pourcentage d'utilisation de chaque région
  • -Gccause est identique à -gcutil mais ajoute la cause du dernier GC et éventuellement des événements GC actuels

4. Args de ligne de commande

Si nous exécutons une application Java avec des options de configuration de tas (par exemple, -Xms et -Xmx ), il existe quelques autres astuces pour trouver les valeurs spécifiées.

Par exemple, voici comment jps signale ces valeurs:

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

Avec cette approche, nous ne pouvons trouver que ces valeurs statiques. Il n'y a donc aucun moyen de connaître, par exemple, la mémoire engagée actuelle .

En plus de jps , quelques autres outils rapporteront la même chose. Par exemple, «jcmd VM.command_line» indiquera également ces détails:

$ 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

De plus, sur la plupart des systèmes basés sur Unix, nous pouvons utiliser ps du paquet procps :

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

Enfin, sous Linux, nous pouvons utiliser le système de fichiers virtuel / proc et ses fichiers pid:

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

Le fichier cmdline , dans un répertoire nommé d'après le pid Quarkus, contient l'entrée de ligne de commande de l'application.

5. Conclusion

Dans ce rapide didacticiel, nous avons vu plusieurs façons d'obtenir la taille du tas d'une application Java en cours d'exécution.