Guide des paramètres les plus importants de la JVM

Guide des principaux paramètres de la machine virtuelle Java

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons explorer les options les plus connues pouvant être utilisées pour configurer la machine virtuelle Java.

2. Mémoire de tas explicite - Options Xms et Xmx

L'une des pratiques les plus courantes en matière de performances consiste à initialiser la mémoire de tas conformément aux exigences de l'application.

C’est pourquoi nous devons spécifier la taille minimale et maximale du tas. Les paramètres ci-dessous peuvent être utilisés pour y parvenir:

-Xms[unit]
-Xmx[unit]

Ici,unit désigne l'unité dans laquelle la mémoire (indiquée parheap size) doit être initialisée. Les unités peuvent être marquées comme‘g' pour Go,‘m' pour Mo et‘k' pour Ko.

Par exemple, si nous voulons affecter au minimum 2 Go et au maximum 5 Go à la machine virtuelle Java, nous devons écrire:

-Xms2G -Xmx5G

À partir de Java 8, la taille deMetaspace n'est pas définie. Une fois qu'il atteint la limite globale, JVM l'augmente automatiquement, cependant, pour surmonter toute instabilité inutile, nous pouvons définir la taille deMetaspace avec:

-XX:MaxMetaspaceSize=[unit]

Ici,metaspace size indique la quantité de mémoire que nous voulons affecter àMetaspace.

EnOracle guidelines, après la mémoire totale disponible, le deuxième facteur le plus influent est la proportion du tas réservée à la jeune génération. Par défaut, la taille minimale du YG est de 1310MB et la taille maximale est deunlimited.

Nous pouvons leur assigner explicitement:

-XX:NewSize=[unit]
-XX:MaxNewSize=[unit]

3. Collecte des ordures

Pour une meilleure stabilité de l'application, le choix du bon algorithmeGarbage Collection est essentiel.

JVM a quatre types d'implémentationsGC:

  • Collecteur de déchets série

  • Ramasse-ordures parallèle

  • Ramasse-miettes CMS

  • G1 Garbage Collector

Ces implémentations peuvent être déclarées avec les paramètres ci-dessous:

-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+USeParNewGC
-XX:+UseG1GC

Plus de détails sur les implémentations deGarbage Collection peuvent être trouvéshere.

4. Journalisation GC

Pour surveiller strictement la santé de l’application, nous devons toujours vérifier les performancesGarbage Collectionde la JVM. Le moyen le plus simple de le faire est de consigner l'activité deGC dans un format lisible par l'homme.

En utilisant les paramètres suivants, nous pouvons enregistrer l'activité deGC:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=< number of log files >
-XX:GCLogFileSize=< file size >[ unit ]
-Xloggc:/path/to/gc.log

UseGCLogFileRotation spécifie la politique de roulement du fichier journal, un peu comme log4j, s4lj, etc. NumberOfGCLogFiles indique le nombre maximum de fichiers journaux pouvant être écrits pour un cycle de vie d'application unique. GCLogFileSize spécifie la taille maximale du fichier. Enfin,loggc indique son emplacement.

Le point à noter ici est qu'il existe deux autres paramètres JVM disponibles (-XX:+PrintGCTimeStamps et-XX:+PrintGCDateStamps) qui peuvent être utilisés pour imprimer l'horodatage par date dans le journalGC.

Par exemple, si nous voulons attribuer un maximum de 100GCfichiers journaux, chacun ayant une taille maximale de 50 Mo et que nous voulons les stocker dans l’emplacement ‘/home/user/log/', nous pouvons utiliser la syntaxe ci-dessous:

-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=10
-XX:GCLogFileSize=50M
-Xloggc:/home/user/log/gc.log

Cependant, le problème est qu'un thread de démon supplémentaire est toujours utilisé pour surveiller l'heure du système en arrière-plan. Ce comportement peut créer un goulot d'étranglement des performances; c’est pourquoi il est toujours préférable de ne pas jouer avec ce paramètre en production.

5. Manipulation de la mémoire

Il est très courant pour une grande application de faire face àout of memory error, ce qui, à son tour, entraîne le blocage de l'application. Il s'agit d'un scénario très critique et très difficile à reproduire pour résoudre le problème.

C’est pourquoi JVM est livré avec certains paramètres qui vident la mémoire du tas dans un fichier physique qui peut être utilisé plus tard pour détecter les fuites:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./java_pid.hprof
-XX:OnOutOfMemoryError="< cmd args >;< cmd args >"
-XX:+UseGCOverheadLimit

Quelques points à noter ici:

  • HeapDumpOnOutOfMemoryError demande à la JVM de vider le tas dans un fichier physique en cas deOutOfMemoryError

  • HeapDumpPath indique le chemin où le fichier doit être écrit; n'importe quel nom de fichier peut être donné; cependant, si JVM trouve une balise<pid> dans le nom, l'ID de processus du processus en cours à l'origine de l'erreur de mémoire insuffisante sera ajouté au nom de fichier au format.hprof

  • OnOutOfMemoryError est utilisé pour émettre des commandes d'urgence à exécuter en cas d'erreur de mémoire insuffisante; La commande appropriée doit être utilisée dans l'espace des arguments cmd. Par exemple, si nous voulons redémarrer le serveur dès qu’une mémoire insuffisante se produit, nous pouvons définir le paramètre:

-XX:OnOutOfMemoryError="shutdown -r"
  • UseGCOverheadLimit est une stratégie qui limite la proportion du temps de la VM qui est passé dans GC avant qu'une erreurOutOfMemory ne soit générée

6. 32/64 Bit

Dans l'environnement de système d'exploitation où des packages 32 et 64 bits sont installés, la machine virtuelle Java choisit automatiquement les packages d'environnement 32 bits.

Si nous voulons définir manuellement l'environnement à 64 bits, nous pouvons le faire en utilisant le paramètre ci-dessous:

-d

Le bit du système d'exploitation peut être32 ou64. Plus d'informations à ce sujet peuvent être trouvéeshere.

7. Misc

  • -server: active «Server Hotspot VM»; ce paramètre est utilisé par défaut dans la JVM 64 bits

  • -XX:+UseStringDeduplication:Java 8u20 a introduit ce paramètre JVM pour réduire l'utilisation inutile de la mémoire en créant trop d'instances du mêmeString; cela optimise la mémoire du tas en réduisant les valeursString en double vers un seul tableau global char []

  • -XX:+UseLWPSynchronization: définit la stratégie de synchronisation basée surLWP (Light Weight Process) au lieu de la synchronisation basée sur les threads

  • -XX:LargePageSizeInBytes: définit la grande taille de page utilisée pour le tas Java; il prend l'argument en Go / Mo / Ko; avec des pages de plus grande taille, nous pouvons mieux utiliser les ressources matérielles de la mémoire virtuelle; cependant, cela peut entraîner des tailles d'espace plus grandes pour lesPermGen, ce qui à son tour peut forcer à réduire la taille de l'espace de tas Java

  • -XX:MaxHeapFreeRatio: définit le pourcentage maximum de tas libre aprèsGC pour éviter la réduction.

  • -XX:MinHeapFreeRatio: définit le pourcentage minimum de tas libre aprèsGC pour éviter l'expansion; pour surveiller l'utilisation du tas, vous pouvez utiliserVisualVM livré avec JDK.

  • -XX:SurvivorRatio: rapport deeden /survivor space size - par exemple,-XX:SurvivorRatio=6 définit le rapport entre chaquesurvivor space eteden space à 1: 6,

  • -XX:+UseLargePages: utilise la mémoire de grandes pages si elle est prise en charge par le système; veuillez noter queOpenJDK 7 a tendance à planter si vous utilisez ce paramètre JVM **

  • -XX:+UseStringCache: active la mise en cache des chaînes couramment allouées disponibles dans le poolString **

  • -XX:+UseCompressedStrings: utilisez un typebyte[] pour les objetsString qui peuvent être représentés au format ASCII pur

  • -XX:+OptimizeStringConcat: il optimise les opérations de concaténationString lorsque cela est possible **

8. Conclusion

Dans cet article rapide, nous avons découvert certains paramètres importants de la machine virtuelle Java, qui peuvent être utilisés pour optimiser et améliorer les performances générales des applications.

Certains d'entre eux peuvent également être utilisés à des fins de débogage.

Si vous souhaitez explorer les paramètres de référence plus en détail, vous pouvez commencerhere.