IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

 

Développons en Java   2.30  
Copyright (C) 1999-2022 Jean-Michel DOUDOUX    (date de publication : 15/06/2022)

[ Précédent ] [ Sommaire ] [ Suivant ] [Télécharger ]      [Accueil ]

 

119. VisualVM

 

chapitre    1 1 9

 

Niveau : niveau 2 Elémentaire 

 

VisualVM est un outil intégré au JDK  depuis la version 6 update 7: il permet de superviser l'activité d'une JVM et propose quelques fonctionnalités de base pour profiler des applications Java. Ces fonctionnalités sont similaires à celles de JConsole avec des possibilités supplémentaires.

VisualVM offre de nombreuses fonctionnalités proposées par différents autres outils du JDK pour obtenir des informations de la JVM. C'est un outil graphique qui permet de superviser, d'analyser et de profiler une application exécutée dans une JVM.

VisualVM permet de se connecter sur des JVM locales ou distantes. Chaque JVM utilise un onglet : il est donc possible d'ouvrir plusieurs JVM. Chaque onglet d'une JVM possède plusieurs onglets pour afficher les informations selon leur type.

VisualVM est extensible en permettant l'utilisation de plugins.

La page officielle de VisualVM est à l'url https://visualvm.github.io/

 

attention A partir de Java 9, VisualVM n'est plus fourni avec le JDK. Il est développer dans un projet open source.

Depuis sa mise en open source, plusieurs versions ont été publiées :

  • version 1.4 en décembre 2017 : support de Java 9
  • version 2.0 en février 2020 : les plugins 1.x ne sont pas compatibles 2.x, visualisation des fichiers JFR, recherche dans les threads dumps

Ce chapitre contient plusieurs sections :

 

119.1. L'utilisation de VisualVM

Pour exécuter VisualVM, il faut exécuter l'application jvisualvm.exe contenue dans le sous-répertoire bin du répertoire d'installation du JDK.

La splashscreen de Visual VM s'affiche. Lors du premier lancement, une boîte de dialogue informe que l'application va se calibrer.

Cliquez sur le bouton « OK ».

Cliquez sur le bouton « OK ».

Pour utiliser toutes les fonctionnalités de Visual VM, il est nécessaire d'exécuter l'application dans une JVM de Java 6.0 minimum. Le code peut cependant avoir été compilé en Java 5. Il est aussi possible d'utiliser VisualVM sur une JVM 5.0 mais dans ce cas toutes les fonctionnalités ne seront pas utilisables.

En utilisant une JVM de Java version 6 ou supérieure, VisualVM va pouvoir obtenir des informations plus détaillées notamment concernant la mémoire, la CPU, les threads, ...

VisualVM est une application graphique permettant d'obtenir des informations détaillées sur des applications s'exécutant dans une JVM. Ceci permet d'analyser et de contrôler le fonctionnement et les dysfonctionnements d'une application.

Le JDK proposait déjà plusieurs outils pour obtenir certaines de ces informations : jconsole, jmap, jstack, jstat ou jinfo. VisualVM permet d'obtenir des informations équivalentes et supplémentaires tout en les présentant sous une forme graphique.

Les informations fournies par Visual VM peuvent permettre notamment :

  • D'obtenir des informations sur la configuration de la JVM
  • D'analyser la consommation de mémoire et de CPU
  • De visualiser et de gérer les activités du ramasse-miettes
  • De capturer et analyser le heap
  • D'identifier des fuites de mémoires
  • De mesurer les performances pour les améliorer
  • De gérer les MBeans

A son lancement, la fenêtre de VisualVM est composée de deux parties :

  • Applications : affiche la liste des applications exécutées dans une JVM locale ou distante dont il est possible d'obtenir des informations et de gérer les snapshots
  • La partie principale : l'onglet start propose des liens vers des ressources

Un snapshot est une capture d'informations d'une JVM à un moment donné.

Le menu contextuel d'une application permet plusieurs actions :

  • Open : ouvrir un onglet pour obtenir des informations sur l'application
  • Thread dump : obtenir une image des threads
  • Heap dump : obtenir une image du tas (instances de classes)
  • Application snapshot : créer une image sauvegardée des informations

Les informations concernant une application sont affichées dans la partie centrale. Chaque application possède son propre onglet.

 

119.2. Les plugins pour VisualVM

VisualVM peut être enrichi de fonctionnalités grâce à des plugins qui peuvent être téléchargés sur le VisualVM plugins Center et gérés dans le plugins manager.

Pour installer un plugin, il faut utiliser le menu Tools/Plugins.

L'onglet Updates permet de mettre à jour les plugins déjà installés.

L'onglet Available Plugins permet d'installer de nouveaux plugins. Il suffit de sélectionner les cases à cocher des plugins souhaités et de cliquer sur le bouton « Install ».

Cliquer sur le bouton « Next ».

Lisez la licence et si vous l'acceptez, sélectionnez la case à cocher et cliquez sur le bouton « Install ». Les plugins sont téléchargés et installés.

Cliquez sur le bouton « Finish » pour prendre en compte les plugins en redémarrant VisualVM.

 

119.3. L'utilisation de VisualVM

La fenêtre principale est composée de deux parties :

  • la partie de gauche affiche une arborescence des JVM locales et distantes, les threaddumps et les snapshots
  • la partie de droite permet d'obtenir les informations sur la ou les JVM connectées (un onglet par JVM)

L'arborescence de l'onglet Applications comporte plusieurs noeuds principaux :

  • local : affiche les JVM en cours d'exécution sur la même machine que VisualVM
  • remote : affiche les machines distantes et les JVM à surveiller
  • snapshots : affiche les snapshots qui ont été pris

L'arborescence affiche aussi pour chaque JVM, les threaddumps, les heapdumps et les snapshots qui ont été sauvegardés. Sur Solaris ou Linux, les coredumps sont aussi affichés.

Chaque machine distante doit être ajoutée explicitement : elle sera conservée par VisualVM tant qu'il arrivera à s'y connecter au démarrage.

Pour afficher automatiquement les JVM en cours d'exécution sur la machine distante, celle-ci doit exécuter l'utilitaire jstatd fourni avec le JDK de Sun/Oracle.

Le menu contextuel associé à une JVM locale permet plusieurs actions :

  • Open : se connecter à la JVM
  • Thread Dump : demander la génération d'un thread dump
  • Heap Dump : demander la génération d'un heap dump
  • Profile : se connecter à la JVM et la profiler
  • Application Snapshot : capturer les informations sur la JVM
  • Enable Heap Dump on OOME : demander la génération d'un heap dump si une exception de type OutOfMemeoryException est levée dans la JVM

Pour chaque JVM connectée, plusieurs onglets permettent d'obtenir des informations :

  • Overview : afficher des informations générales sur la JVM
  • Monitor : afficher des informations graphiques sur l'activité de la JVM
  • Threads : donner un aperçu de l'activité des threads
  • Profiler : analyser le comportement de l'application concernant la CPU et la mémoire

D'autres onglets peuvent aussi être disponibles en fonction des plugins installés.

 

119.4. La connexion à une JVM

VisualVM est capable de détecter et de se connecter automatiquement aux JVM version 6 et supérieures. Pour des JVM version 5 ou distante, il est nécessaire de configurer JMX pour l'activer (en utilisant les propriétés com.sun.management.jmxremote.* lors du lancement de la JVM) et de s'y connecter avec VisualVM.

JMX peut être utilisé pour surveiller et gérer une JVM locale ou distante. Pour activer et configurer la connexion à la JVM, plusieurs propriétés peuvent être fournies au moment de son lancement :

  • com.sun.management.jmxremote.port : permet de préciser le port sur lequel il sera possible de se connecter au serveur de MBeans
  • com.sun.management.jmxremote.ssl : booléen qui permet de préciser si les échanges sont encryptés avec SSL
  • com.sun.management.jmxremote.authenticate : booléen qui permet de préciser si la connection requiert un mot de passe
Exemple :
java -Dcom.sun.management.jmxremote.port=3456 -Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false MonApp

VisualVM n'est pas capable de détecter et se connecter à une JVM :

  • locale exécutée avec un utilisateur différent de celui utilisé pour lancer Visual VM
  • distante sur laquelle le démon jstatd n'est pas lancé ou si les utilisateurs utilisés pour lancer jstad et la JVM sont différents

L'outil jps peut uniquement détecter les JVM locales exécutées avec l'utilisateur qui a lancé jps.

L'outil jstatd propose une interface qui permet de se connecter aux JVM exécutées sur la machine depuis une machine distante.

Pour se connecter à une JVM locale avec JMX, il suffit d'utiliser l'option "Add JMX connection" du menu contextuel de l'élément Local de l'arborescence Applications. Une boîte de dialogue permet de saisir les informations de connexions à JMX.

Le plus simple est de saisir le numéro du port du serveur de MBean après les deux points dans la zone de saisie Connection et de cliquer sur le bouton "OK". Un nouvel élément apparaît dans la sous-arborescence du noeud Local avec une icône spéciale.

Pour se connecter à une JVM distante en utilisant JMX , il suffit d'utiliser l'option "Add JMX connection" du menu contextuel hors de tout élément de l'arborescence.

Il suffit alors de saisir le nom de la machine hôte, suivi du caractère deux points et du port JMX à utiliser.

VisualVM permet de se connecter à une JVM distante : les JVM distantes sont affichées comme éléments fils de l'élément Remote dans l'arborescence.

Pour se connecter à une JVM distante sans utiliser JMX, il faut lancer l'outil jstatd fourni avec le JDK sur la machine distante. Ensuite, il faut ajouter cette machine en utilisant l'option "Add Remote Host" du menu contextuel de l'élément "Remote" dans l'arborescence.

Une petite boîte de dialogue permet de saisir le nom de l'hôte ou son adresse I.P. et son nom d'affichage.

Si l'outil jstatd est exécuté sur la machine hôte, les JVM qui s'exécutent sur la machine sont affichées comme éléments fils.

 

119.5. L'obtention d'informations

VisualVM permet d'obtenir des informations générales et sur l'activité de la mémoire et des threads.

 

119.5.1. La génération d'un thread dump

Il est possible d'utiliser VisualVM pour capturer des informations sur les threads dans un thread dump au moment où il est demandé. Un thread dump permet d'obtenir la stacktrace de tous les threads sans arrêter définitivement l'application.

Pour demander un thread dump, il y a deux actions possibles :

  • utiliser l'option Thread Dump du menu contextuel de la JVM concernée
  • cliquer sur le bouton Thread Dump de l'onglet Threads

Une fois le thread dump généré, un onglet est ajouté pour afficher son contenu ainsi qu'un élément fils de la JVM concernée dans l'arborescence.

Un thread dump est particulièrement utile pour savoir quels traitements sont exécutés par chaque thread.

 

119.5.2. La génération d'un heap dump

Il est possible d'utiliser VisualVM pour capturer des informations sur les objets contenus dans le tas (heap) de la JVM au moment de la demande.

Un heap dump est une image à un instant donné de tous les objets contenus dans le heap d'une JVM. Le parcours d'un heap dump permet de connaître les objets qui ont été créés dans le heap de la JVM.

VisualVM peut être utilisé pour créer un heap dump d'une JVM locale version 6 ou supérieures. Un heap dump créé avec VisualVM est temporaire et doit être explicitement sauvegardé en utilisant l'option Save as du menu contextuel. Si un heap dump n'est pas sauvegardé explicitement, il sera perdu lors de la fermeture de VisualVM.

Pour demander la génération d'un heap dump à VisualVM, il a deux possibilités :

  • utiliser l'option "Heap Dump" du menu contextuel de la JVM concernée
  • cliquer sur le bouton "Heap Dump" de l'onglet Monitor de la JVM concernée

La génération d'un heap dump crée une entrée dans l'arborescence fille de la JVM et ouvre un nouvel onglet qui va permettre de consulter les informations qu'il contient.

 

119.5.3. Le parcours d'un heap dump

VisualVM permet de parcourir le contenu d'un fichier heap dump et ainsi de voir les objets du tas. Ces fichiers heap dump peuvent être des fichiers .hprof ou des fichiers heap dump créés grâce à VisualVM.

Pour ouvrir un heap dump, il est possible :

  • de double cliquer sur un heap dump affiché dans l'arborescence pour les heap dumps créés avec VisualVM
  • d'utiliser le menu File/Load et de sélectionner un fichier .hprof

Chaque heap dump s'affiche dans son propre onglet pour la JVM concernée.

VisualVM permet de consulter le contenu d'un heap dump grâce à plusieurs vues :

  • Summary : c'est la vue par défaut.
  • Classes : permet d'obtenir le nombre d'instances et leur taille pour chaque classe
  • Instances : permet d'afficher les instances d'une classe

La vue Summary affiche des informations sur le contenu du heap dump :

  • un résumé du contenu
  • l'environnement d'exécution
  • les propriétés de la JVM
  • les threads

La vue Classes permet d'obtenir pour chaque type le nombre d'instances dans le heap et la taille qu'elles y occupent.

Pour visualiser les instances d'une classe, il faut utiliser le menu contextuel « Show in Instances View »

Il est possible :

  • de cliquer sur l'en-tête de chaque colonne pour modifier l'ordre de tri des informations.
  • de limiter les classes affichées aux sous-classes de celle dont le menu contextuel « Show Only Subclasses » est utilisé.
  • de filtrer les classes affichées. Pour cela, il faut saisir tout ou partie du nom de la classe, sélectionner au besoin le type de filtre à appliquer et cliquer sur le bouton vert à droite de la zone de saisie de texte.

Pour annuler le filtre, il faut cliquer sur le bouton rouge à droite de la zone de saisie de texte.

La vue Instances permet d'afficher la liste des instances d'une classe.

La sélection d'une instance permet d'afficher ses champs et ses références.

 

119.5.4. L'onglet Overview

L'onglet Overview affiche des informations générales sur la JVM et son environnement d'exécution :

  • PID : l'identifiant du processus de la JVM dans le système
  • Host : la machine sur laquelle la JVM s'exécute
  • Main class : le nom pleinement qualifié de la classe principale
  • Arguments : les arguments passés à la classe principale
  • JVM : la version de la JVM
  • Java Home : le chemin de la JVM
  • JVM flags : les arguments passés à la JVM
  • Heap dump on OOME : affiche si l'option Heap dump on OOME de la JVM est activée

C'est l'onglet qui est affiché par défaut lors de la connexion à une JVM.

L'onglet Saved Data affiche le nombre de fichiers créés avec VisualVM pour la JVM.

L'onglet JVM Arguments affiche les arguments fournis à la JVM.

L'onglet System properties affiche les propriétés de la JVM.

 

119.5.5. L'onglet Monitor

L'onglet Monitor affiche des informations en temps réel sur l'évolution de la charge CPU de la JVM, de la taille du Heap et de la PermGen, du nombre de classes chargées et de Threads dans la JVM.

L'utilisation de cet onglet implique uns légère surcharge sur l'utilisation de la JVM.

Les informations sont affichées sous la forme de graphiques en temps réel avec le temps en abscisse :

  • CPU : affiche l'utilisation CPU de la JVM et l'utilisation de la CPU par le garbage collector
  • Heap : affiche la taille du heap, celle utilisée et sa taille maximale. Le graphique affiche l'évolution de ces deux premières propriétés au cours du temps
  • PermGen : affiche la taille de la permanent generation, la taille de la permgen et la taille maximale de la permgen. Le graphique affiche l'évolution de ces deux premières propriétés au cours du temps
  • Classes : affiche le nombre total de classes chargées et déchargées ainsi que les classes partagées
  • Threads : affiche le nombre de threads actifs et de démons

L'onglet Monitor permet de réaliser deux actions grâce à deux boutons :

  • « Perform GC » : faire une demande d'exécution du ramasse-miettes à la JVM
  • « Heap Dump » : demander la génération d'un heap dump

 

119.5.6. L'onglet Threads

L'onglet Threads permet de suivre l'activité des threads de la JVM.

L'onglet Timeline affiche en temps réel l'activité des threads en affichant leur état. Cette activité est obtenue grâce à JMX ou une JVM locale si sa version est supérieure ou égale à 6.

Il est possible de cliquer sur les boutons "Zoom in" et "Zoom out" pour modifier l'échelle de la ligne de temps. La liste déroulante permet de sélectionner les threads qui sont affichés : tous les threads, les threads actifs ou les threads terminés.

Il est possible de double-cliquer sur un thread pour basculer sur l'onglet Details.

La liste déroulante permet de sélectionner les threads qui sont affichés : les threads sélectionnés, tous les threads, les threads actifs ou les threads terminés.

Le sous-onglet Details permet d'obtenir l'heure de chaque changement de statut du thread.

L'onglet General affiche des statistiques sur les états du thread.

 

119.6. Le profilage d'une JVM

VisualVM intègre un profiler qui permet de fournir des informations pour analyser la performance et l'utilisation mémoire d'une application. VisualVM ne peut pas être utilisé pour se profiler lui-même ou pour profiler une JVM distante.

Pour profiler une application, il faut utiliser l'option Profile du menu contextuel de la JVM concernée qui affiche l'onglet Profiler.

L'onglet Profiler permet de démarrer et de stopper une session de profiling sur l'utilisation de la CPU ou de la mémoire d'une JVM locale.

Le profiling CPU permet de mesurer les performances des classes exécutées dans la JVM.

Le profiling mémoire permet d'analyser l'utilisation du heap.

Lors du lancement d'une session de profiling, VisualVM se connecte à la JVM et collecte les informations qui sont affichées dans la partie « Profiling results ».

Elle possède plusieurs boutons :

  • Update Result Automatically : une fois activé, les informations sont rafraîchies automatiquement toutes les 2 secondes
  • Update Result Now : permet de demander le rafraîchissement des informations
  • Run Garbage Collection : demande à la JVM d'exécuter le ramasse-miettes
  • Reset Collected Results : permet de réinitialiser les informations déjà collectées
  • Take Snapshot : permet de prendre un snapshot des informations collectées. Le snapshot est affiché dans un onglet dédié
  • Save Current View : permet de sauvegarder l'affichage courant sous la forme d'une image de type png.

Par défaut, aucune classe n'est instrumentée pour permettre la capture d'informations la concernant. Pour configurer la session de profiling, il faut cocher la case "Settings". La modification de la configuration ne peut se faire que si aucune session de profiling n'est en cours d'exécution.

L'onglet CPU settings permet de configurer les classes à instrumenter. La zone de texte "Start profiling from classes" permet de préciser les classes qui serviront de points d'entrées pour le profiling.

En utilisant le caractère * et selon le bouton radio sélectionné, il est possible de préciser le ou les packages des classes à profiler ("Profile only classes") ou au contraire, de celles qui ne le sont pas ("Dot not profile classes").

L'onglet Memory settings permet de configurer le profiling de la mémoire.

Un bouton radio permet de profiler uniquement les objets créés ou les objets créés et l'activité du ramasse-miettes.

Un tableau affiche pour chaque classe : le nombre d'instances créées, la taille occupée par les objets depuis le début du profiling ainsi que le pourcentage correspondant.

La zone de texte en dessous du tableau permet d'appliquer un filtre sur le nom des classes affichées.

 

119.7. La création d'un snapshot

VisualVM permet de créer un snapshot qui va contenir les informations collectées de la JVM. Il est possible de sauvegarder un snapshot pour le réouvrir ultérieurement.

VisualVM peut créer deux types de snapshots :

  • Profiler snapshot : le snapshot contient les informations capturées pendant une session de profiling sur l'utilisation de la CPU ou de la mémoire. Ce type de snapshot ne peut être créé que lorsqu'une session de profiling est en cours.
  • Application snaphot : le snapshot contient les heap dumps et les thread dumps qui ont été créés

 

119.8. Le plugin VisualGC

VisualGC est un plugin pour VisualVM qui permet de représenter graphiquement l'activité du ramasse-miettes et de certaines activités de la JVM (PermGen, chargement de classes, compilation JIT).

Une représentation graphique affiche l'occupation des espaces mémoires des différentes générations : young generation (Eden, survivor 1 et 2 (S0 et S1)), old generation et PermGen.

Le panneau Compile Time indique le nombre de tâches de compilation exécutées et le temps consacré à cette compilation du bytecode en code natif depuis le lancement de la JVM. La hauteur du graphe n'a pas d'échelle : elle indique simplement une activité de compilation courte ou longue.

Le panneau Class Loader Time indique le nombre de classes chargées, déchargées et le temps passé à ces tâches depuis le démarrage de la JVM. La hauteur du graphe n'a pas d'échelle : il représente l'activité de chargement et de déchargement de classes par la JVM.

Le panneau GC Time indique le nombre d'opérations de récupérations de mémoire réalisées, le temps consacré à ces tâches et la raison de l'exécution de la dernière récupération. La hauteur du graphe n'a pas d'échelle : il représente l'activité du ramasse-miettes.

Le panneau Eden Space indique : la taille maximale de l'espace et l'occupation actuelle entre parenthèses, la taille des objets qu'il contient, le nombre de récupérations de mémoire effectuées dans cet espace et le temps que cela a nécessité depuis le lancement de la JVM. La hauteur du graphe correspond à la taille maximale de l'espace : il représente l'occupation de l'espace Eden.

Les panneaux Survivor 0 et Survivor 1 indiquent la taille maximale de l'espace et l'occupation actuelle entre parenthèses, et la taille des objets qu'il contient. La hauteur du graphe correspond à la taille maximale de l'espace : il représente l'occupation de l'espace Survivor concerné.

Le panneau Old Gen indique la taille maximale de l'espace et l'occupation actuelle entre parenthèses, la taille des objets qu'il contient, le nombre de récupérations de mémoire effectuées dans cet espace (full garbage) et le temps que cela à nécessité depuis le lancement de la JVM. La hauteur du graphe correspond à la taille maximale de l'espace : il représente l'occupation de l'espace Old.

Le panneau PermGen indique la taille maximale de l'espace et l'occupation actuelle entre parenthèses ainsi que la taille des objets qu'il contient. La hauteur du graphe correspond à la taille courante de l'espace : il représente l'occupation de l'espace PermGen.

Le panneau Histogram affiche une répartition de l'âge des objets actifs dans l'espace Survivor après la dernière exécution du ramasse-miettes dans cet espace et les paramètres utilisés pour réaliser la promotion des objets.

 

 


[ Précédent ] [ Sommaire ] [ Suivant ] [Télécharger ]      [Accueil ]

78 commentaires Donner une note à l´article (5)

 

Copyright (C) 1999-2022 Jean-Michel DOUDOUX. Vous pouvez copier, redistribuer et/ou modifier ce document selon les termes de la Licence de Documentation Libre GNU, Version 1.1 ou toute autre version ultérieure publiée par la Free Software Foundation; les Sections Invariantes étant constitués du chapitre Préambule, aucun Texte de Première de Couverture, et aucun Texte de Quatrième de Couverture. Une copie de la licence est incluse dans la section GNU FreeDocumentation Licence. La version la plus récente de cette licence est disponible à l'adresse : GNU Free Documentation Licence.