Paramètres de tas
-XMX3550M: Réglez la mémoire de tas maximale de JVM à 3550m.
-XMS3550M: définissez la mémoire de tas initiale de JVM à 3550m. Cette valeur peut être définie de la même chose que -xmx pour éviter la mémoire de réallocation JVM chaque fois que la collection de déchets est terminée.
-XSS128K: Réglez la taille de la pile de chaque fil. Après JDK5.0, chaque taille de pile de thread sera de 1 m et avant cela, chaque taille de pile de thread sera de 256k. Il doit être ajusté en fonction de la taille de mémoire requise du thread de l'application. Dans la même mémoire physique, la réduction de cette valeur peut générer plus de threads. Cependant, le système d'exploitation a toujours une limite sur le nombre de threads dans un processus et ne peut pas être généré à l'infini, avec des valeurs d'expérience allant d'environ 3000 à 5000.
-XMN2G: Réglez la taille de la génération des jeunes de la mémoire du tas sur 2G. La taille de la mémoire du tas de tas = la taille de la génération des jeunes + la taille de la génération ancienne + taille de génération persistante. La génération permanente est généralement fixée en taille de 64 m, donc après avoir augmenté la génération plus jeune, la taille de la génération plus âgée sera réduite. Cette valeur a un grand impact sur les performances du système et Sun recommande officiellement la configuration comme 3/8 de l'ensemble du tas.
-Xx: permSize = 256m: Définissez la valeur initiale de la génération persistante de la mémoire du tas à 256m. (Il semble que ce soit les paramètres d'initialisation des IDE tels que l'éclipse)
-Xx: maxNewSize = taille: la valeur maximale que l'objet nouvellement généré peut occuper la mémoire.
-Xx: maxperMSize = 512M: définissez la valeur maximale de la génération persistante à 512m.
-Xx: newratio = 4: Définissez le rapport de la jeune génération de la mémoire de tas (y compris Eden et deux régions de survivants) à l'ancienne génération de la mémoire du tas (à l'exclusion de la génération persistante). S'il est fixé à 4, le rapport entre la génération plus jeune à la génération plus âgée est de 1: 4.
-Xx: Survivorratio = 4: Définissez le rapport de la zone d'Eden dans la zone de survivant dans la jeune génération de mémoire de tas. Situé à 4, le rapport entre deux zones de survivant (la jeune génération de la mémoire de la mémoire JVM a 2 zones de survivants par défaut) et une zone d'Eden est de 2: 4, et une zone de survivant représente 1/6 de toute la jeune génération.
-Xx: maxtrenuringthreshold = 7: signifie qu'un objet est placé chez les personnes âgées s'il se déplace 7 fois dans l'espace de sauvetage (zone de survivant) et n'a pas été recyclé.
S'il est réglé sur 0, les jeunes objets de génération ne traversent pas la zone de survivant et entrent directement dans l'ancienne génération. Pour plus d'applications dans l'ancienne génération, cela peut améliorer l'efficacité.
Si cette valeur est réglée sur une valeur plus grande, l'objet de la jeune génération sera copié plusieurs fois dans la zone de survivant, ce qui peut augmenter le temps de survie de l'objet dans la jeune génération et augmenter la probabilité que l'objet soit recyclé dans la jeune génération.
Sélection du recycleur
JVM offre trois options: collecteur de série, collecteur parallèle et collecteur simultané, mais le collecteur en série ne convient que pour les petits volumes de données, donc le choix ici est principalement pour le collecteur parallèle et le collecteur simultané.
Par défaut, JDK5.0 a utilisé les collectionneurs en série avant. Si vous souhaitez utiliser d'autres collectionneurs, vous devez ajouter des paramètres correspondants au démarrage. Après JDK5.0, le JVM fera des jugements intelligents basés sur la configuration du système actuelle.
Collectionneur en série
-Xx: + usageSerialgc: Définissez le collecteur en série
Collecteur parallèle (priorité de débit)
-Xx: + useParallelgc: sélectionnez le collecteur des ordures comme collecteur parallèle. Cette configuration n'est valable que pour les jeunes générations. Autrement dit, dans la configuration ci-dessus, la jeune génération utilise une collection simultanée, tandis que la génération plus âgée utilise toujours la collection de série.
-Xx: parallelgctHreads = 20: Configurez le nombre de threads du collecteur parallèle, c'est-à-dire combien de threads sont collectés en même temps. Cette valeur est mieux configurée pour être égale au nombre de processeurs.
-Xx: + useParalleLoldGC: Configurez la méthode de collecte des ordures à l'ancienne pour la collection parallèle. JDK6.0 prend en charge la collection parallèle pour les générations plus anciennes.
-Xx: maxgcpausemillis = 100: définit le temps maximum (en millisecondes) pour chaque collection d'ordures de jeune génération. Si ce temps ne peut pas être rempli, le JVM ajustera automatiquement la taille de la jeune génération pour répondre à cette valeur.
-Xx: + useadaptivesizolicy: Après avoir réglé cette option, le collecteur parallèle sélectionnera automatiquement la taille de la zone de la jeune génération et le rapport de zone de survivant correspondant pour atteindre le temps de réponse ou la fréquence de collecte minimum spécifiée par le système cible.
Ce paramètre est recommandé pour être allumé lors de l'utilisation du collecteur parallèle.
Collectionneur simultané (le temps de réponse est préféré)
-Xx: + useParNewgc: Définissez la collection de jeunes génération à la collection simultanée. Peut être utilisé simultanément avec la collection CMS. JDK5.0 ou supérieur, le JVM le définira par lui-même en fonction de la configuration du système, il n'est donc pas nécessaire de refléter cette valeur.
CMS, nom complet concurrentlowpauseCollector, est un nouvel algorithme GC introduit dans la version ultérieure de JDK1.4. Il a été encore amélioré dans JDK5 et JDK6. Son principal scénario approprié est que l'importance du temps de réponse est supérieure à celle des exigences de débit, peut résister aux threads de collecte des ordures et aux threads d'application partageant des ressources de processeur, et il existe relativement de nombreux objets à longue durée de vie dans l'application. Le CMS est utilisé pour le recyclage de l'entrée tenue, c'est-à-dire le recyclage des personnes âgées. L'objectif est de minimiser le temps de pause de l'application, de réduire les risques d'occurrence FullGC et d'utiliser des fils de collecte des ordures en même temps que les fils d'application pour marquer et effacer les personnes âgées.
-XX: + USECOnCMarksweepgc: Définissez l'ancienne collection simultanée. Après avoir configuré cela dans le test, la configuration de -xx: newratio = 4 n'est pas valide. Par conséquent, il est préférable de définir la taille de la jeune génération avec -xmn pour le moment.
-Xx: cmsfullgcsbeforoncompaction =: Étant donné que le collecteur simultané ne compresse ni n'organise l'espace mémoire, les "fragments" seront générés après avoir fonctionné pendant une période, ce qui réduira l'efficacité du fonctionnement. Ce paramètre définit l'espace mémoire pour être comprimé et organisé après l'exécution de FullGC.
-Xx: + usecmsCompactatfullCollection: activez la compression pour les générations plus anciennes. Peut affecter les performances, mais peut éliminer la fragmentation de la mémoire.
-Xx: + cmsincrementalmode: réglé sur le mode de collecte incrémentiel. Généralement applicable à la situation du processeur unique.
-XX: CMSInitiatOccupancyFraction = 70: signifie que lorsque l'espace de l'ancienne génération atteint 70%, la CMS sera lancée pour être exécutée pour s'assurer que l'ancienne génération a suffisamment d'espace pour accepter les objets de la jeune génération.
Remarque: Si vous utilisez deux collectionneurs à ordures, Upputcollector et ConcurrentLowPauSeCollector, vous devez avoir une taille de mémoire élevée appropriée pour vous préparer au multi-thread.
autre
-Xx: + ScavengeBeforefullgc: La prochaine génération de GC a priorité sur FullGC.
-Xx: -DisableExplicitGC: Inhibit Calling System.gc (), mais le GC du JVM est toujours valide.
-Xx: + maxfdlimit: maximiser la limite du nombre de descripteurs de fichiers.
-Xx: + usethreadpriorités: activez l'API de priorité du thread local, même si java.lang.thread.setpriority () prend effet, il sera invalide.
-Xx: softreflurpolicymsPermb = 0: l'objet "Soft Reference" peut survivre à 0 millisecondes après le dernier accès (par défaut est 1 seconde).
-Xx: cibleSurvivorRatio = 90: 90% de l'espace de survivant à occuper (la valeur par défaut est de 50%). Augmentez le taux d'utilisation du survivant - si vous le dépassez, vous essayerez la collecte des ordures.
Informations auxiliaires
-XX: -CITIME: L'impression consomme du temps dans la compilation JIT
-Xx: errorfile =. / Hs_err_pid.log: Enregistrer le journal d'erreur ou les données dans le fichier spécifié
-Xx: -extendedDtraceProbes: Allumez la sonde DTrace spécifique à Solaris
-Xx: HeapDuMppath =. / Java_pid.hprof: spécifie le nom ou le nom du fichier lors de l'exportation d'informations sur le tas
-Xx: -heapDumponoutofMemoryError: Exportez les informations pertinentes dans le tas à ce moment lorsque le débordement de la mémoire est rencontré pour la première fois.
-Xx: onerror = ";": Exécutez la commande personnalisée après une erreur fatale
-Xx: onoutofMemoryError = ";": Exécuter la commande personnalisée lors de la rencontre de la mémoire déborde pour la première fois
-Xx: -printClassHistogram: Imprimer des informations en colonnes de la classe après la rencontre de Ctrl-Break, la même que la fonction JMAP-Histo
-XX: -PrintConcurrentlocks: Imprimez des informations connexes sur les verrous simultanés après la rencontre de Ctrl-Break, la même que la fonction JSTACK-L
-Xx: -printCommandLineFlags: Marques d'impression qui apparaissent sur la ligne de commande
-Xx: -printcompilation: imprimez les informations pertinentes lorsqu'une méthode est compilée
-Xx: -printgc: imprimez les informations pertinentes à chaque fois GC
-Xx: -printgcDetails: Imprimez les détails à chaque fois GC
-Xx: -printgctimestamps: imprimez l'horodatage de chaque GC
-Xx: -traceclassloading: suivez les informations de chargement de la classe
-Xx: -traceclassloadingPreorder: suit les informations de chargement de toutes les classes référencées à
-Xx: -traceclassresolution: suivi du pool constant
-Xx: -traceclassUnloading: suivi des informations de déchargement des classes
-Xx: -traceloadercraintes: suivi des informations connexes sur les contraintes de chargeur de classe
Pratique du réglage du service JVM
Serveur: 8cup, 8gmem
par exemple
java-xmx3550m-xms3550m-xss128k-xx: newratio = 4-xx: SurvivorRatio = 4-xx: maxpermSize = 16m-xx: maxthershreshold = 0
Plan de réglage:
-XMX5G: Définissez la mémoire maximale disponible de JVM sur 5G.
-XMS5G: Définissez la mémoire JVM initiale sur 5G. Cette valeur peut être définie de la même chose que -xmx pour éviter la mémoire de réallocation JVM chaque fois que la collection de déchets est terminée.
-XMN2G: Réglez la taille de la jeune génération sur 2G. La taille de la mémoire du tas de tas = la taille de la génération des jeunes + la taille de la génération ancienne + taille de génération persistante. La génération permanente est généralement fixée en taille de 64 m, donc après avoir augmenté la génération plus jeune, la taille de la génération plus âgée sera réduite. Cette valeur a un grand impact sur les performances du système et Sun recommande officiellement la configuration comme 3/8 de l'ensemble du tas.
-Xx: + useParNewgc: Définissez la collection Young Generation to Parallel. Peut être utilisé simultanément avec la collection CMS. JDK5.0 ou supérieur, le JVM le définira par lui-même en fonction de la configuration du système, il n'est donc pas nécessaire de refléter cette valeur.
-Xx: parallelgcthreads = 8: Le nombre de threads pour configurer le collecteur parallèle, c'est-à-dire combien de threads sont collectés en même temps. Cette valeur est mieux configurée pour être égale au nombre de processeurs.
-Xx: Survivorratio = 6: définit le rapport de taille de la zone Eden et de la zone de survivant de la jeune génération. Selon l'expérience, le rapport des deux zones de survivants à une zone d'Eden est de 2: 6, et une zone de survivant représente 1/8 de toute la jeune génération.
-Xx: maxtrenuringthreshold = 30: Réglez l'âge maximum des ordures (nombre de fois). S'il est réglé sur 0, les objets de la jeune génération entrent directement dans la génération plus âgée sans passer par la zone de survivante. Pour plus d'applications dans l'ancienne génération, l'efficacité peut être améliorée. Si cette valeur est définie sur une valeur plus grande, l'objet jeune génération copiera plusieurs fois dans la zone de survivant, ce qui peut augmenter le temps de survie de l'objet et la jeune génération et augmenter la probabilité qu'elle soit recyclée dans la jeune génération. Réglé sur 30 signifie qu'un objet est placé dans l'ancienne génération s'il se déplace 30 fois dans l'espace de survivant et n'a pas été recyclé.
-XX: + USECOnCMarksweepgc: Définissez l'ancienne collection simultanée. Après avoir testé et configuré ce paramètre, le paramètre -xx: newratio = 4 ne sera pas valide. Par conséquent, il est préférable de définir la taille de la jeune génération avec -xmn, donc ce paramètre n'est pas recommandé.
Références - Génération de la mémoire de tas JVM
La mémoire de tas des machines virtuelles est divisée en trois générations: jeune génération, vieille génération et génération permanente. Parmi eux, la génération persistante stocke principalement les informations de la classe Java, qui ont peu à voir avec les objets Java à collecter par le collecteur des ordures. Par conséquent, la division entre la jeune génération et la génération plus âgée a un impact plus important sur la collecte des ordures.
Jeune génération
Tous les objets nouvellement générés sont placés pour la première fois dans la jeune génération. Le but de la jeune génération est de collecter des objets avec des cycles de vie courts le plus rapidement possible. Les jeunes générations sont divisées en trois domaines. Une zone d'Eden, deux zones de survivant (généralement).
La plupart des objets sont générés dans la zone Eden. Lorsque la zone d'Eden est pleine, les objets encore survivants seront copiés dans la zone de survivante (l'un des deux). Lorsqu'une zone de survivante est pleine, les objets survivants dans cette zone seront copiés dans une autre zone de survivante. Lorsque l'autre zone de survivante est également pleine, les objets copiés de la zone de survivants précédents et survivant toujours à ce moment seront copiés dans la "zone titulaire".
Il convient de noter que les deux zones de survivants sont symétriques et n'ont aucune relation en séquence, il peut donc y avoir des objets copiés à partir de la zone d'Eden et des objets copiés de l'autre zone de survivant dans la même zone de survivante en même temps; et seuls les objets copiés dans l'ancienne zone (relative). De plus, il y en a toujours un dans la zone des survivants qui est vide. Dans des cas particuliers, selon les besoins du programme, la zone de survivant peut être configurée dans plusieurs (plus de deux), ce qui peut augmenter le temps d'existence d'objets dans la jeune génération et réduire la possibilité d'être placés dans la génération plus âgée.
Génération plus ancienne
Les objets qui survivent encore après N (configurable) collections à ordures dans la jeune génération seront placés dans la génération plus âgée. Par conséquent, on peut considérer que les personnes âgées stockent des objets avec des cycles de vie plus longs.
Génération persistante
Utilisé pour stocker des données statiques, telles que Javaclass, la méthode, etc. La génération persistante n'a pas d'impact significatif sur la collecte des ordures, mais certaines applications peuvent générer ou appeler dynamiquement certaines classes, telles que l'hibernate, etc. À l'heure actuelle, un espace de génération persistant relativement important doit être mis en place pour stocker ces types qui augmentent dynamiquement pendant le fonctionnement. La taille de génération persistante est définie par -xx: maxpermSize =.
Résumer
Ce qui précède est l'intégralité du contenu de cet article sur l'optimisation de la machine virtuelle Java (Tuning JVM). J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!