web-dev-qa-db-fra.com

Java simultané et parallèle GC

Cet article ici suggère d'utiliser -XX:+UseParNewGC "Pour activer un GC parallèle de nouvelle génération avec le GC simultané". 

Ma confusion est que pour permettre à la fois les GC parallèles et simultanées, devrais-je

  • utiliser -XX:+UseParNewGC ou
  • utiliser à la fois -XX:+UseParNewGCet-XX:+UseConcMarkSweepGC?

PS

J'utilise JVM 6.

36
pdeva

Étant donné que le document que vous avez lié était destiné à une 1.4.2 VM, je suppose que vous utilisez (les machines virtuelles 5 et 6 se comportent différemment). 

De http://Java.Sun.com/docs/hotspot/gc1.4.2/

si -XX: + UseConcMarkSweepGC est utilisé sur la ligne de commande puis le drapeau UseParNewGC est également défini sur true s'il n'est pas par ailleurs explicitement défini sur le ligne de commande

La réponse est donc que vous devez uniquement utiliser -XX: + UseConcMarkSweepGC et cela activera le collecteur simultané avec le collecteur parallèle de nouvelle génération.

Edit: pour Java 6, le même indicateur (-XX: + UseConcMarkSweepGC) active le collecteur simultané. Le choix du collecteur souhaité dépend de quelques éléments et vous devez tester différentes configurations. Mais il existe des directives très générales. Si vous avez un seul processeur, une machine à thread unique, vous devez utiliser le collecteur de série (par défaut pour certaines configurations, il peut être activé explicitement pour avec -XX: + UseSerialGC). Pour les ordinateurs multiprocesseurs où votre charge de travail est essentiellement liée au processeur, utilisez le collecteur parallèle. Cette option est activée par défaut si vous utilisez l'indicateur -server ou si vous pouvez l'activer explicitement avec -XX: + UseParallelGC. Si vous préférez raccourcir les pauses du CPG au détriment de l'utilisation de plus de temps CPU total pour le CPG et si vous avez plusieurs CPU, vous pouvez utiliser le collecteur simultané (-XX: + UseConcMarkSweepGC). Notez que le collecteur simultané a tendance à nécessiter plus de RAM alloué à la machine virtuelle que les collecteurs en série ou en parallèle pour une charge de travail donnée car une fragmentation de la mémoire peut survenir.

38
sk.
7
anjanb

Cette entrée de blog contient une liste détaillée des différents collectionneurs et des options disponibles: http://blogs.Oracle.com/jonthecollector/entry/our_collectors

7
tpoindex

Le réglage Java GC est fondamentalement un art sombre, mais dans mon application (fonctionne avec un segment de mémoire de plus de 50 Go et 16 cœurs physiques), le collecteur ConcMarkSweep entraînait une accélération 3 fois supérieure à celle par défaut du serveur, et une accélération 2,2 fois supérieure à ParallelOldGC. 

Si vous ne partagez pas la machine avec d'autres processus (les cœurs inactifs sont simplement gaspillés), utilisez ConcMarkSweepGC. 

5
Charles Munger

ParNew est le collecteur par défaut de la nouvelle génération lorsque CMS est utilisé. Vous devez simplement spécifier -XX: + UseConcMarkSweepGC pour utiliser CMS et ParNew sera utilisé par défaut. CMS est un bon collecteur si la priorité la plus élevée est d'éviter les tremblements du GC, mais si le débit est plus important, par exemple pour un lot comme un travail, le collecteur parallèle Sun par défaut fait un meilleur travail.

1
Deven

Vous ne pouvez pas activer deux options du CPG en même temps. Je vous suggérerais d’utiliser le système de gestion de contenu (CMS), qui est meilleur que celui de la génération suivante, comparé à UseParNewGC. Si vous utilisez Java 1.7 ou une version ultérieure et que la taille de segment de mémoire est relativement plus grande (> 4 Go, par exemple), envisagez d’utiliser G1.