La mémoire réellement utilisée par l'application Java ne peut pas être obtenue avec la commande top. ** L'exécution de la commande top vous indique uniquement la quantité de mémoire allouée par la JVM. ** ** Cette fois, je vais vous montrer comment utiliser l'outil jstat pour avoir une idée approximative de la taille de la mémoire réelle de Java. En utilisant cette méthode, vous pouvez voir la quantité approximative de mémoire utilisée sans affecter de manière significative le traitement sans modifier l'application.
jstat est un outil de surveillance des données statistiques des machines virtuelles Java. Comme il est inclus dans le JDK, si vous installez le JDK, il sera installé et prêt à être utilisé en même temps. Cependant, veuillez noter que la documentation officielle indique qu'il s'agit d'une fonctionnalité expérimentale et que ce ne sera peut-être plus une version à l'avenir.
Exécutez l'exemple d'application pour un traitement approprié. Les options suivantes sont ajoutées au démarrage de Java, et les tailles de mémoire maximale et minimale du segment de mémoire sont toutes deux spécifiées à 20 Go.
-xms20g -xmx20g
Il s'agit d'une application qui effectue un traitement par lots qui prend environ 3000 secondes du début à la fin.
Je vais omettre les détails du programme.
Après avoir démarré l'exemple d'application, vérifiez l'ID de processus de l'application avec la commande jps.
$ jps
29366 Jps
31781 sampleApp
L'ID de processus de sampleApp est 31781. Je veux exécuter la commande jstat et écrire le résultat dans un fichier. Exécutez la commande suivante.
$ jstat -gcutil -t 31781 1000 > jstat.tsv
Cette fois, toutes les secondes, les statistiques du GC et l'horodatage du démarrage de l'application sont affichés ensemble. Il est sorti sous la forme d'un fichier nommé "jstate.tsv". Pour les options de la commande jstat, veuillez vous référer à la page officielle.
La sortie de la commande jstat est la suivante.
Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
39.8 0.00 0.00 38.00 0.00 17.13 19.75 0 0.000 0 0.000 0.000
40.8 0.00 0.00 44.00 0.00 17.13 19.75 0 0.000 0 0.000 0.000
~~ Omis ~~
3019.0 63.30 74.99 100.00 53.52 96.26 86.35 753 414.206 25 581.636 995.842
3020.0 78.67 74.99 100.00 53.52 96.26 86.35 753 414.206 25 581.636 995.842
À partir de la sortie de la commande jstat, nous étudierons la mémoire réellement utilisée. ** Pour étudier la transition approximative de la mémoire utilisée, il suffit de prêter attention uniquement à l'élément "O" (Old area memory allocation rate = usage rate) dans la sortie de jstat. ** **
Le graphique ci-dessous montre la valeur de «Horodatage» sur l'axe horizontal et la valeur de «O» sur l'axe vertical.
À partir de ce graphique, vous pouvez lire l'utilisation de la mémoire. Cependant, à première vue, le taux d'allocation mémoire oscille violemment entre 50% et 100%, ce qui n'est pas clair. ** La zone Ancienne contient un mélange de données qui sont réellement utilisées à ce moment-là et de données qui ne sont plus utilisées, il vous suffit donc de trouver la quantité de données qui est utilisée. ** ** Le graphique ci-dessous montre la synchronisation d'exécution de Full GC superposée sur le graphique ci-dessus avec une ligne pointillée bleue.
Vous pouvez voir que l'utilisation de la mémoire est faible après le GC complet. ** Vous pouvez voir l'utilisation réelle de la mémoire de l'application en regardant uniquement le taux d'allocation de mémoire lorsque la mémoire diminue immédiatement après ce GC complet. ** ** Dans la figure ci-dessous, les valeurs de synchronisation réduites sont reliées par une ligne rouge continue. Et cette valeur est la transition approximative de la mémoire réelle utilisée.
En vérifiant le graphique ci-dessus, vous pouvez voir ce qui suit.
De plus, il est possible de vérifier l'utilisation approximative de la mémoire dans chaque processus en la comparant avec le journal de l'application.
Pourquoi est-il possible de connaître l'utilisation de la mémoire simplement en regardant la taille de l'ancienne zone après FullGC? Pour le comprendre, vous devez savoir comment fonctionne la gestion de la mémoire JVM, mais en voici quelques-unes très simplifiées.
Nous avons résumé comment vérifier l'utilisation de la mémoire des applications Java à l'aide de la commande jstat. Je pense que c'est une bonne idée de vérifier grossièrement l'utilisation de la mémoire pour chaque processus utilisant cette méthode, puis d'étudier l'utilisation de la mémoire de chaque objet, en particulier dans les processus qui utilisent la mémoire.
Recommended Posts