Dans cet article nous donnons quelques commandes sympa de la JVM qui peuvent parfois bien dépanner.
Débloque les + belles offres tech en 10 mins
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
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 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.
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.
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.
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.
Débloque les + belles offres tech en 10 mins
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.
Ça n’étonnera personne si nous affirmons que le monde du développement logiciel est en constante…
En Allemagne, le travail en tandem à temps partiel, aussi appelé « jobsharing » est…
On se retrouve comme d'habitude pour le début du classement qcm saison automne ! Mais…
La saison printemps des tests techniques WeLoveDevs s'est terminée le 31 mai, et c'est Axel…
Se former en tant que développeur autodidacte peut sembler intimidant, mais c'est tout à fait…
Dans le cadre de leurs développements, les entreprises se tournent de plus en plus vers…