jeudi 20 décembre 2012

Appel gc (Garbage Collector) et autres fonctions depuis JMX

Voici un court article de trucs et astuces pour JMX.

Sommaire :



Utilisation des composants Graphiques

Par exemple, on peut vouloir appeler le garbage collector sur une machine distante, en se connectant à JConsole c'est assez simple :

Appel GC depuis JConsole
 Ou en utilisant explicitement des Beans :

Appel au Garbage Collector depuis JConsole

Le même exemple avec Java VisualVM qui est fourni par défaut dans les JDK récents au même titre que JConsole :

Appel au Garbage Collecter en utilisant Java VisualVM


Effectuer une connexion distante

 Je remets ici comment lancer un programme Java pour permettre la connexion distante à JConsole, pour plus de détails se référer à mes précédents articles JMX - Partie 1 - Partie 2 et Partie 3 :
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9021 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar mon_programme.jar
Une fois les paramètres ajoutés à la ligne de lancement, pour se connecter avec JConsole, ou Jvisualvm il suffit de rentrer l'adresse de la machine et le port :
Connexion à la JVM avec JConsole
Voici le même exemple avec JVisualvm qui est plus attrayant :

Connexion avec Java VisualVM
Pour afficher cette boîte de dialogue, il faut d'abord faire un clic-droit sur Local et cliquer sur "Add JMX Connection..."

En utilisant la ligne de commande (Jmxsh)

Jmxsh que je vous invite à télécharger sur google code est une petite bibliothèque permettant d'effectuer des appels JMX, sans être miraculeuse elle est bien pratique. En gardant l'exemple de l'appel au GarbageCollector :
java -jar jmxsh-R5.jar
History file null/.jmxsh_history not writable, command-line history disabled.
jmxsh v1.0, Tue Jan 22 17:23:12 CET 2008

Type 'help' for help.  Give the option '-?' to any command
for usage help.

Starting up in shell mode.
%
Le shell est démarré, maintenant on peut se connecter et invoquer le GarbageCollector
% jmx_connect -h localhost -p 9021
Connected to service:jmx:rmi:///jndi/rmi://localhost:9021/jmxrmi.

% jmx_invoke --mbean java.lang:type=Memory gc
can't read "MBEAN": no such variable
Le message can't read "MBEAN": no such variable ne pose pas de problèmes, après vérification le GC est bien effectué. On peut également automatiser l'appel, en copiant notre appel précédent dans un fichier :
$ echo jmx_invoke --mbean java.lang:type=Memory gc > script
$ java -jar jmxsh-R5.jar -l gc.log -h localhost -p 9021 script
Bien sûr dans le script il y a moyen d'automatiser plus de choses, on peut par exemple imaginer une série d'appel au GarbageCollector sur toutes les machines gérées :
#Contenu du fichier script
jmx_connect -h machine1 -p 9021 
jmx_invoke --mbean java.lang:type=Memory gc
jmx_close
jmx_connect -h machine2 -p 9021 
jmx_invoke --mbean java.lang:type=Memory gc
jmx_close
jmx_connect -h machine3 -p 9021 
jmx_invoke --mbean java.lang:type=Memory gc
jmx_close
jmx_connect -h machine4 -p 9021 
jmx_invoke --mbean java.lang:type=Memory gc
jmx_close
jmx_connect -h machine4 -p 9022 #Plusieurs JVM sur la même machine on change de port 
jmx_invoke --mbean java.lang:type=Memory gc
jmx_close
#Fin du fichier script

$ java -jar jmxsh-R5.jar -l gc.log script