Mesure de la mémoire pour les applications Java utilisant jstat

Enquête sur la taille de la mémoire Java utilisée

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.

Préparation de jstat

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.

Programme d'analyse

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.

Exécutez jstat

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.

Sortie de la commande jstat

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

Analyse de la taille de la mémoire utilisée

À 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.

old領域割り当て率のグラフ

À 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.

old領域割り当て率のグラフ(FGC実行明示)

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.

old領域割り当て率のグラフ(ヒープメモリ概要)

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.

Brève explication de cette méthode

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.

  1. Dans les applications Java, toutes les données qui restent en mémoire pendant un certain temps sont stockées dans la zone Ancienne de la mémoire.
  2. Lorsque la zone Old est pleine (environ 90% ou plus), Full GC s'exécute, examine toutes les données de la zone Old, libère la mémoire s'il y a des données inutilisées et seules les données utilisées sont anciennes. Laissez dans la zone.
  3. En regardant la quantité de données dans la zone Ancienne immédiatement après FullGC, vous pouvez connaître la quantité de mémoire qui ne peut pas être libérée (réellement utilisée par l'application).

Résumé

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

Mesure de la mémoire pour les applications Java utilisant jstat
Remarques sur l'utilisation de BLE dans les applications iOS
Mesure de la mémoire des applications Java sous Windows
Mise à jour de l'environnement Java de Windows à l'aide de Chocolatey
Spécifier les options de compilation Java / Kotlin pour les applications Android
ChatWork4j pour l'utilisation de l'API ChatWork en Java
Pour l'apprentissage JAVA (2018-03-16-01)
[Développement Java] Mémoire Java
Java n ° 3 pour l'utilisation de la mémoire de flux utile pour les entreprises
IDE 2017 pour Java
Java pour instruction
[Java] [SQL Server] Se connecter à SQL Server 2017 local à l'aide de JDBC pour SQL Server
J'ai essayé d'utiliser l'instruction Extended for en Java
Bibliothèque de mesures de couverture Java
[Java] pour instruction, while instruction
Tri à l'aide du comparateur java
[Java] Package de gestion
[Java] pour instruction / étendu pour instruction
Pratique de grattage avec Java ②
Contre-mesures pour OutOfMemoryError en java
PNL pour Java (NLP4J) (2)
(Mémo) Java pour instruction
PNL pour Java (NLP4J) (1)
Pratique du grattage avec Java ①
Comment créer une image de conteneur légère pour les applications Java
Créer un code QR pour Google Authenticator à l'aide de ZXing en Java
Conseils d'utilisation de Salesforce SOAP et de l'API Bulk en Java
Essayez Spark Submit to EMR à l'aide du kit AWS SDK pour Java
BCrypt + Mesure du temps de traitement pour chaque nombre d'étirements en Java