Développons en Java 2.30 | |
Copyright (C) 1999-2022 Jean-Michel DOUDOUX | (date de publication : 15/06/2022) |
|
Niveau : | 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/
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 :
Ce chapitre contient plusieurs sections :
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 :
A son lancement, la fenêtre de VisualVM est composée de deux parties :
Un snapshot est une capture d'informations d'une JVM à un moment donné.
Le menu contextuel d'une application permet plusieurs actions :
Les informations concernant une application sont affichées dans la partie centrale. Chaque application possède son propre onglet.
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.
La fenêtre principale est composée de deux parties :
L'arborescence de l'onglet Applications comporte plusieurs noeuds principaux :
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 :
Pour chaque JVM connectée, plusieurs onglets permettent d'obtenir des informations :
D'autres onglets peuvent aussi être disponibles en fonction des plugins installés.
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 :
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 :
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.
VisualVM permet d'obtenir des informations générales et sur l'activité de la mémoire et des threads.
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 :
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.
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 :
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.
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 :
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 :
La vue Summary affiche des informations sur le contenu du heap dump :
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 :
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.
L'onglet Overview affiche des informations générales sur la JVM et son environnement d'exécution :
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.
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 :
L'onglet Monitor permet de réaliser deux actions grâce à deux boutons :
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.
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 :
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.
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 :
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.
|