Découvrez les principales options JVM (Java Virtual Machine) pour de meilleures performances et un meilleur débogage.
Si vous êtes Développeur Java ou administrateur middleware, vous devez alors savoir ce que signifient les options JVM, leur importance et leur impact sur votre application. Découvrons-les.
Présentation des options JVM
En ce qui concerne les options JVM, il existe trois types d'options que vous pouvez inclure dans votre JVM: options standard, non standard et avancées. Si vous essayez une option avancée, vous utilisez toujours l'option avec -XX
. De même, si vous appliquez une option non standard, vous utilisez -X
. Les options standard ne préfèrent rien à l'option.
Quelles options JVM sont utilisées par votre application?
Si l'application s'exécute sous Linux, vous pouvez utiliser ps -ef | grep java
pour identifier le processus Java et examiner les options JVM imprimées comme arguments de processus. Si plus d'un processus Java est en cours sur le système, vous devrez peut-être utiliser un mot-clé unique à votre application Java.
Si votre argument est trop long, essayez d'utiliser ps -auxww
car cette commande affichera également une longue liste d'arguments.
Après avoir dressé une liste d'indicateurs JVM, vous pouvez vous faire une idée des comportements de toute application Java, par exemple Tomcat.
Java heap size
-Xms- définir la taille initiale du tas Java -Xmx- définir la taille maximale du tas Java -Xss- définir la taille de la pile de threads java
-Xms - Cette option permet de définir la taille du tas de départ pour JVM, par exemple,Xms2048m
ce qui signifie qu'une taille de tas initiale de JVM est d'environ 2 Go. Ainsi, quand une JVM démarre, la mémoire du tas sera d'autant plus grande. Étonnamment oui! Ceci est effectué pour empêcher le redimensionnement pendant le démarrage et améliorer le temps de démarrage de JVM.
-Xmx - Cette option permet de définir la taille maximale du tas de JVM, par exemple,Xmx2048m
ce qui signifie que la taille maximale du tas de JVM sera de 2 Go uniquement.
Vous aurez essentiellement toujours-Xms
et-Xmx
ensemble.
Set Percentage of the heap
-XX: MaxHeapFreeRatio - définit le pourcentage maximum de tas libre après GC pour éviter la réduction.
-XX: MinHeapFreeRatio - définit le pourcentage minimum de tas libre après GC pour éviter l'expansion; pour surveiller l'utilisation du tas, vous pouvez utiliser JCosole.
Enable class data sharing
Spécifier Xshareclasses
option pour activer le partage de données de classe dans un cache de classe partagé. La JVM se connecte à un cache existant ou crée un cache s'il n'en existe pas. Vous pouvez avoir plusieurs caches et vous pouvez spécifier le bon cache en ajoutant une sous-option à la -Xshareclasses
option.
PermGen Size
Les options JVM antérieures définissent la taille de la mémoire du tas mais -XX:PermSize
consiste à définir la taille de l'espace PermGen, où le pool de chaînes et les métadonnées de classe sont enregistrés. Cette option est particulièrement efficace pour un serveur Web comme Tomcat, qui charge souvent des classes de l'application Web lors du déploiement.
À propos, il convient de savoir que l'espace PermGen est pris en charge par Metaspace dans Java 8, et cette option n'est pas applicable si vous exécutez avec JRE 8 JVM.
Print GC
-verbose: gc - enregistre les exécutions du garbage collector et leur durée. -XX: + ImprimerGCDétails - inclut les données de -verbose: gc mais ajoute également des informations sur la taille de la nouvelle génération et des horaires plus précis. -XX: -ImprimerGCTimeStamps - Imprimer les horodatages lors de la collecte des ordures.
Ces options JVM sont utilisées pour activer la journalisation de garbage collection, qui est très efficace pour l'opération sensible à la latence. Nous étions sur des systèmes où nous recherchions des latences de l'ordre de la microseconde, et si vous le reconnaissez, un gros garbage collection peut durer plusieurs millisecondes.
Nous optons donc pour une architecture sans GC comme le disruptor LMAX, mais en effet si vous n'allez pas pour une application ultra sensible à la latence, cette option pratique vous conseillera d'importantes statistiques GC. Il vous indiquera s'il s'agit d'un ramasse-miettes volumineux ou mineur, quel type de ramasse-miettes est appliqué, à quelle fréquence la mémoire est restaurée, et combien de temps elle est conservée, etc.
Handling ‘OutOfMemory’ Error
Pour déclencher un vidage de tas en cas de mémoire insuffisante, vous pouvez utiliser -XX:+HeapDumpOnOutOfMemoryError
Cette option JVM produit un vidage de pile lorsque votre JVM meurt avec une erreur OutOfMemory. Il n'y a aucune dépense à moins qu'un MOO se produise réellement. Cet indicateur est indispensable pour les systèmes de production car c'est généralement le seul moyen de déterminer le problème en profondeur.
Le vidage du tas sera configuré par défaut dans le «répertoire courant» de la JVM. Si vous souhaitez créer des vidages de tas sur un répertoire spécifique, exécutez
-XX:HeapDumpPath= [path-to-heap-dump-directory]
-XX:+UseGCOverheadLimit
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
Le fichier de vidage de tas peut être énorme, jusqu'à gigaoctets, alors assurez-vous que le système de fichiers cible autorise une capacité suffisante.
Si nous voulons redémarrer le serveur immédiatement après un manque de mémoire, nous pouvons définir ce paramètre dans le même but -
XX:OnOutOfMemoryError="shutdown -r"
Trace classloading and unloading
-XX:+TraceClassLoading
et -XX:+TraceClassUnloading
sont deux options JVM que nous utilisons pour imprimer les informations de journalisation chaque fois que les classes se chargent dans JVM ou se déchargent de JVM. Ces indicateurs JVM sont utiles si vous avez un type de fuite de mémoire lié au chargeur de classe et que vous soupçonnez que les classes ne sont pas en cours de déchargement ou de récupération de place.
Java classpath
Parler de JAVA Classpath alors-Xbootclasspath
spécifie les entrées de chemin de classe que nous voulons chargées sans vérification. La JVM vérifie toutes les classes qu'elle charge pour s'assurer qu'elle n'essaye pas de déréférencer un objet avec un int, une pop d'entrées supplémentaires hors de la pile ou d'en pousser trop, et ainsi de suite.
Mettre la classe sur le bootclasspath évite également le coût, mais ne doit être utilisé que lorsque vous savez que les classes ont été vérifiées plusieurs fois auparavant. Dans JRuby, cela a réduit le temps de démarrage de moitié et plus pour un simple script.
Profiling
Le profilage Java est le processus de surveillance de divers paramètres de niveaux JVM tels que les exécutions de méthodes, les exécutions de threads, les récupérations de mémoire et les créations d'objets. Le profilage Java vous offre une vue plus fine de l'exécution de votre application cible et de son utilisation des ressources.
-Xprof
-Xrunhprof
64-bit environment
Dans l'environnement du système d'exploitation où les packages 32 et 64 bits sont installés, la JVM choisit automatiquement les packages d'environnement 32 bits par défaut.
Si nous voulons définir manuellement l'environnement sur 64 bits, nous pouvons le faire en utilisant -d<OS bit>
paramètre. Et évidemment, le bit du système d'exploitation peut être 32 ou 64.
Conclusion
J'espère que cela vous aidera à configurer les paramètres JVM pour votre application. Si vous souhaitez en savoir plus sur la gestion de la mémoire java, consultez ceci Cours Udemy.