L'ajustement des paramètres de la JVM en production est essentiel pour assurer la stabilité et la performance des applications Java. Voici un guide pratique avec des exemples et des techniques de diagnostic.
Exemple de configuration avec le ramasse-miettes G1
Pour démarrer une appilcation Java avec des paramètres de tuning ciblés, utilisez une commande structurée comme suit :
nohup java -jar -server \
-Xms2G -Xmx2G \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=150 \
-XX:G1NewSizePercent=25 \
-XX:G1MaxNewSizePercent=35 \
-XX:+DisableExplicitGC \
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/app/oom-error.log \
-Xloggc:/var/log/app/gc-logs.log \
-jar mon-application.jar > /dev/null 2>&1 &
Dans cet exemple, la mémoire du tas est fixée à 2 Go, le temps de pause GC maximum est de 150 ms, et les proportions de la nouvelle génération sont ajustées entre 25% et 35%.
Configuration avancée des journaux GC
Pour activer la rotation des journaux GC avec contrôle de la taille, ajoutez ces options :
-Xloggc:/opt/app/logs/gc-%t.log \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=4 \
-XX:GCLogFileSize=15M \
-XX:+PrintGCDetails \
-XX:+PrintGCDateStamps \
-XX:+PrintGCCause
Cela génère des fichiers de journaux GC rotatifs avec horodatage et information sur la cause des collections.
Méthodologie d'optimisation JVM
Pour diagnostiquer et résoudre les problèmes en production, suivez ces étapes :
- Identifiez les symptômes tels que les pics de charge CPU, les temps de réponse élevés ou les erreurs de mémoire.
- Utilisez des outils en ligne de commande pour collecter des données : jstat pour les statistiques GC, jstack pour les threads, et jmap pour les dumps mémoire.
- Analysez les dumps avec des outils comme Eclipse MAT ou VisualVM pour détecter les fuites de mémoire ou les deadlocks.
- Pour un suivi en temps réel, employez des profileurs tels que JProfiler ou Arthas.
Commandes de diagnostic fréquentes
jps -mlvV: Liste les processus Java avec leurs arguments complets.jstat -gcutil <pid>: Affiche un résumé de l'utilisation mémoire et des compteurs GC.top -Hp <pid>: Montre l'utilisation CPU par thread pour un processus spécifique.
Analyse des fichiers de dump mémoire
Lors de la création d'un dump avec jmap -dump:live,format=b,file=heap.bin <pid>, examinez l'état des threads pour repérer des anomalies. Voici un extrait typique :
"Worker-Thread-5" #45 prio=5 os_prio=0 tid=0x00007f8a10234000 nid=0x1234 waiting on condition [0x00007f8a0f800000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000e6d00100> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.ArrayBlockingQueue.take(ArrayBlockingQueue.java:403)
...
Ce thread est en attente sur une file bloquante, ce qui peut indiquer un goulot d'étranglement dans le code applicatif.
Détail des options JVM clés
-server: Active le mode serveur pour privilégier le débit.-Xmset-Xmx: Définissent respectivement la taille initiale et maximale du tas pour éviter les ajustements dynamiques.-XX:+UseG1GC: Utilise l'algorithme G1 comme ramasse-miettes.-XX:MaxGCPauseMillis: Fixe un objectif pour le temps de pause maximum lors des collections GC.-XX:+DisableExplicitGC: Empêche les appels explicites àSystem.gc()qui peuvent déclencher des Full GC inutiles.-XX:+HeapDumpOnOutOfMemoryError: Génère automatiquement un dump du tas lors d'une erreur OutOfMemoryError.-Xloggc: Spécifie le chemin de sortie pour les journaux GC.