Passer au contenu principal

Dans cet article nous donnons quelques commandes sympa de la JVM qui peuvent parfois bien dépanner.

Quelques rappels sur les niveaux de visibilités

Afficher la liste des process Java démarrés

Pour obtenir la liste des process Java démarrés de manière portable, la commande à utiliser est :


jps

Cette commande vous donnera une sortie avec le PID de chaque processus Java, ainsi que le nom du JAR ou du fichier .class qui est exécuté. Voici par exemple une sortie de cette commande :


2880 Jps
7272 org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar

Afficher des informations (très) détaillées sur un process Java démarré

Il est possible d’avoir de très nombreuses infos sur un process Java démarré, tel que les flags de la JVM, la ligne de commande de lancement et d’autres informations d’environnement très utiles. Pour ce faire il suffit de taper la commande suivante :


jinfo <PID>

PID est ici le process id qui nous intéresse. Je ne vais pas fournir la sortie de cette commande ici car elle est très verbeuse. Sachez également qu’en lançant VisualVM vous obtiendrez le résultat de cette commande si vous cliquez sur un process Java.

Afficher les stack traces

Afficher les stack traces de programmes Java est très utile notamment dans deux cas :

– Vous rencontrez un deadlock ou une appli Java qui fait fumer votre CPU (si si, déjà vu des applis qui font monter le load average à 40 sur un quad core…).
– Vous voulez faire des analyses de performance
La commande à utiliser dans les deux cas est :


jstack <PID>

Là encore PID indique le process id à analyser. Si votre objectif est uniquement de surveiller les deadlocks il suffit de relancer trois ou quatre fois la commande.

Maintenant si vous voulez faire des analyses de performance vous pouvez utiliser la commande suivante, qui va écrire toutes les deux secondes vos stacks dans un fichier /tmp/foobar :


while true; do jstack <PID> >> /tmp/foobar ; sleep 2s; done

Dernier point : vous pouvez utiliser jstack pour analyser des core dumps de la JVM, en cas de crash de celle-ci. C’est expliqué en détail ici.

Générer un dump mémoire

Les dumps mémoire sont très utiles pour analyser les fuites mémoire ou tout simplement les objets qui prennent beaucoup de place. Une fois ces dumps générés vous pouvez joyeusement les ouvrir avec un profiler. Alors vous me direz, quand il s’agit uniquement de détecter les OutOfMemoryError on peut toujours utiliser le flag -XX:+HeapDumpOnOutOfMemoryError. Attention néanmoins car il s’agit d’un flag pour la JVM Oracle mais dont le fonctionnement n’est pas garanti sur les autres, comme tous les flags -XX.

Bref pour faire un dump mémoire il vous suffit de lancer la commande :


jmap -dump:format=b,file=<votre_fichier> <PID>

Cette commande va écrire vers <votre_fichier> un dump mémoire du processus dont l’identifiant est PID.

jmap offre de nombreuses autres options que vous pouvez découvrir en regardant sa manpage. Et de même que pour jstack on peut utiliser cette commande pour ouvrir un core dump de la JVM.

Un profileur intégré à la JVM

La JVM intègre depuis la version 1.6.0.10 un profiler, VisualVM. Alors certes ce n’est pas la dernière version, celle-ci étant disponible ici. Mais bon c’est toujours bon à prendre.

La fonction la plus utile de ce profiler est probablement le sampler, qui est accessible en faisant un clic droit sur le processus à analyser puis Sample. Contrairement à du profiling le sampler n’instrumente pas les classes, il se contente de relever des métriques de la JVM par l’intermédiaire d’une sorte de JMX local. Par conséquent il n’a que très peu d’impact sur les performances.

Bien entendu VisualVM reste relativement basique et vous n’aurez pas toutes les possibilités d’un produit comme JProfiler ou encore YourKit mais il conviendra néanmoins dans la plupart des cas.

Pour les curieux : afficher les flags par défaut de votre JVM

La JVM est extrêmement paramétrable. On peut notamment configurer le garbage collector, l’usage d’instruction spécifiques du processeur telles qu’AVX et j’en passe. Pour afficher les flags par défaut de votre JVM vous pouvez utiliser la commande :


java -XX:+PrintFlagsFinal

Vous pourrez ainsi afficher toutes les options par défaut qui s’appliquent à votre machine.

Cet article vous a plu ? Vous aimerez sûrement aussi :

Julien
Moi c’est Julien, ingénieur en informatique avec quelques années d’expérience. Je suis tombé dans la marmite étant petit, mon père avait acheté un Apple – avant même ma naissance (oui ça date !). Et maintenant je me passionne essentiellement pour tout ce qui est du monde Java et du système, les OS open source en particulier.

Au quotidien, je suis devops, bref je fais du dév, je discute avec les opérationnels, et je fais du conseil auprès des clients.

Son Twitter Son LinkedIn

Laisser un commentaire