La première chose à propos de CMS que j'ai appris, c'est qu'il a besoin de plus de mémoire que les autres collectionneurs, à environ 25 à 50% de plus c'est un bon point de départ. Cela vous aide à éviter la fragmentation, depuis la CMS ne fait pas de compactage, comme l'arrêt le monde des collectionneurs. Deuxièmement, faire des choses qui aident le garbage collector; Entier.valueOf au lieu de new Integer, se débarrasser de l'anonymat de classes, assurez-vous que les classes internes ne sont pas accéder inaccessible choses (privé à l'extérieur de la classe) des trucs comme ça. Le moins de déchets le mieux. FindBugs et de ne pas ignorer les avertissements aidera beaucoup avec cela.
Aussi loin que l'accordage, j'ai trouvé que vous avez besoin d'essayer plusieurs choses:
-XX:+UseConcMarkSweepGC
Raconte JVM à l'utilisation du CMS poste d'enseignant permanent gen.
Fixer la taille de votre tas: -Xmx2048m -Xms2048m Cela empêche GC d'avoir à faire des choses comme grandir et rétrécir le tas.
-XX:+UseParNewGC
l'utilisation en parallèle plutôt qu'en série de la collection dans la jeune génération. Cela permettra d'accélérer votre mineur collections, surtout si vous avez un très grand jeune gen configuré. Un grand jeune génération est généralement bonne, mais ne pas aller plus de la moitié de l'ancienne gen taille.
-XX:ParallelCMSThreads=X
définir le nombre de threads que de la CMS doit utiliser lorsqu'il est en train de faire des choses qui peuvent être faites en parallèle.
-XX:+CMSParallelRemarkEnabled remarque est de série par défaut, ce qui peut accélérer votre travail.
-XX:+CMSIncrementalMode permet aux applications de fonctionner plus par pasuing GC entre les phases
-XX:+CMSIncrementalPacing permet JVM à la figure de changer la façon dont souvent il recueille au fil du temps
-XX:CMSIncrementalDutyCycleMin=X Minimm quantité de temps passé à faire du GC
-XX:CMSIncrementalDutyCycle=X de Commencer par faire du GC cette % du temps
-XX:CMSIncrementalSafetyFactor=X
J'ai trouvé que vous pouvez obtenir généralement faible temps de pause si vous le configurer de sorte que, fondamentalement, c'est toujours de la collecte. Puisque la plupart du travail est fait en parallèle, vous vous retrouvez avec essentiellement régulière prévisible des pauses.
-XX:CMSFullGCsBeforeCompaction=1
Celui-ci est très important. Il raconte l'CMS collector de toujours compléter la collection, avant de commencer un nouveau. Sans cela, vous pouvez exécuter dans la situation où il jette un tas de travail à l'écart et on recommence.
-XX:+CMSClassUnloadingEnabled
Par défaut, CMS permettra à votre PermGen croître jusqu'à ce qu'il tue votre application en quelques semaines à partir de maintenant. Cet arrêt. Votre PermGen ne serait croissant de bien que si vous faites usage de la Réflexion, ou abusent de la Chaîne.stagiaire, ou de faire quelque chose de mal avec un chargeur de classe, ou de quelques autres choses.
Survivant ratio et tenuring theshold peut aussi être joué avec, en fonction de si vous avez de longue ou de courte durée objets, et combien objet de copie entre la victime espaces, vous pouvez vivre avec. Si vous savez que tous vos objets vont rester dans les parages, vous pouvez configurer zéro de la taille d'survivant des espaces, et tout ce qui survit un jeune gen collection sera immédiatement titularisés.