97 votes

Différence entre -XX:+UseParallelGC et -XX:+UseParNewGC

Il s'agit d'algorithmes pour la collecte des déchets de la jeune génération.

La seconde (UseParNewGC) est activée automatiquement avec le ramassage des ordures de la génération tenante simultanée (cf. GC parallèle et simultané en Java ) mais, y a-t-il une différence entre les deux algorithmes parallèles ?

128voto

fglez Points 4215

Après de nombreuses recherches, la meilleure explication que j'ai trouvée se trouve sur le site Java Performance Tuning, à l'adresse suivante La question du mois : 1.4.1 Algorithmes de collecte d'ordures, 29 janvier 2003

Algorithmes de collecte de déchets de jeune génération

El collecteur de copies (original) (Activé par défaut). Lorsque ce collecteur est activé, tous les threads de l'application sont arrêtés, et la collecte des copies se déroule en utilisant un seul thread (ce qui signifie un seul CPU, même sur une machine multi-CPU). C'est ce qu'on appelle une collecte "stop-the-world", car la JVM interrompt tout le reste jusqu'à ce que la collecte soit terminée.

El collecteur de copies parallèles (Activé en utilisant -XX:+UseParNewGC). Comme le collecteur de copie original, il s'agit d'un collecteur "stop-the-world". Cependant, ce collecteur parallélise la collecte de la copie sur plusieurs threads, ce qui est plus efficace que le collecteur de copie original à un seul thread pour les machines multi-CPU (mais pas pour les machines mono-CPU). Cet algorithme accélère potentiellement la collecte de la jeune génération par un facteur égal au nombre de CPU disponibles, par rapport au collecteur de copie original à un seul fil.

El collecteur parallèle de balayage (Activé en utilisant -XX:UseParallelGC). C'est comme le collecteur de copie parallèle précédent, mais l'algorithme est adapté aux tas de gigaoctets (plus de 10 Go) sur les machines multi-CPU. Cet algorithme de collecte est conçu pour maximiser le débit tout en minimisant les pauses. Il dispose d'une politique de réglage adaptative facultative qui redimensionne automatiquement les espaces de tas. Si vous utilisez ce collecteur, vous ne pouvez utiliser que le collecteur mark-sweep original de l'ancienne génération (c'est-à-dire que le collecteur concurrent plus récent de l'ancienne génération ne peut pas fonctionner avec ce collecteur de la jeune génération).

D'après ces informations, il semble que la principale différence (hormis la coopération avec le CMS) soit que UseParallelGC supporte ergonomie alors que UseParNewGC ne le fait pas.

3 votes

0 votes

@phunehehehe Merci pour le lien ! C'est très utile.

23voto

Ivan Herlambang Points 340

GC parallèle

  • XX:+UseParallelGC Utilise la collecte parallèle des déchets pour les vidanges. (Introduit dans la version 1.4.1)
  • XX:+UseParallelOldGC Utiliser la collecte parallèle des déchets pour les collections complètes. L'activation de cette option définit automatiquement -XX:+UseParallelGC. (Introduit dans la mise à jour 6 de 5.0).

UtilisationParNewGC

UtilisationParNewGC Une version parallèle du collecteur de copies de la jeune génération est utilisée avec le collecteur concurrent (c'est-à-dire que si l'option -XX:+ UseConcMarkSweepGC est utilisé sur la ligne de commande, alors l'indicateur UseParNewGC est également défini sur vrai s'il n'est pas explicitement défini sur la ligne de commande).

La manière la plus simple de comprendre était peut-être de combiner les algorithmes de collecte de déchets réalisés par Alexey Ragozin

<table border="1" style="width:100%">
  <tr>
    <td align="center">Young collector</td>
    <td align="center">Old collector</td>
    <td align="center">JVM option</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Serial Mark-Sweep-Compact</td>
    <td>-XX:+UseSerialGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Serial Mark-Sweep-Compact (PSOldGen)</td>
    <td>-XX:+UseParallelGC</td>
  </tr>
  <tr>
    <td>Parallel scavenge (PSYoungGen)</td>
    <td>Parallel Mark-Sweep-Compact (ParOldGen)</td>
    <td>-XX:+UseParallelOldGC</td>
  </tr>
  <tr>
    <td>Serial (DefNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:-UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td>Parallel (ParNew)</td>
    <td>Concurrent Mark Sweep</td>
    <td>
      <p>-XX:+UseConcMarkSweepGC</p>
      <p>-XX:+UseParNewGC</p>
    </td>
  </tr>
  <tr>
    <td colspan="2">G1</td>
    <td>-XX:+UseG1GC</td>
  </tr>
</table>

Conclusion :

  1. Appliquez l'option -XX:+UseParallelGC lorsque vous avez besoin d'une méthode de collecte parallèle par rapport à la méthode de collecte de l'eau. JEUNE génération UNIQUEMENT , ( mais encore) utiliser la méthode de balayage des marques en série comme OLD collecte des générations
  2. Appliquez l'option -XX:+UseParallelOldGC lorsque vous avez besoin d'une méthode de collecte parallèle par rapport à l'ancienne méthode de collecte. JEUNE génération (définit automatiquement -XX:+UseParallelGC) ET OLD collecte des générations
  3. Appliquez -XX:+UseParNewGC & -XX:+UseConcMarkSweepGC lorsque vous avez besoin d'une méthode de collecte parallèle par rapport à la méthode de collecte de l'eau. JEUNE génération ET requiert la méthode CMS comme votre collection sur OLD mémoire des générations
  4. Vous ne pouvez pas appliquer -XX:+UseParallelGC ou -XX:+UseParallelOldGC avec -XX:+UseConcMarkSweepGC simultanément, c'est pourquoi vous avez besoin de -XX:+UseParNewGC pour être jumelé avec la CMS sinon utilisez -XX:+UseSerialGC explicitement. OU -XX : - UtiliserParNewGC si vous souhaitez utiliser la méthode en série contre la jeune génération.

15voto

Suraj Chandran Points 12859

UseParNewGC, généralement connu sous le nom de "collecteur parallèle de jeune génération", est identique en tous points au collecteur de déchets parallèle (-XX:+UseParallelGC), sauf qu'il est plus sophistiqué et plus efficace. Il peut également être utilisé avec un "collecteur concurrent à faible pause".

Ver FAQ Java GC Pour plus d'informations, voir la question 22.

Notez qu'il y a quelques bogues connus avec UseParNewGC

8 votes

Savez-vous quels sont les bogues connus ou quelle version de la JVM en est atteinte ?

3voto

Avinash Ganta Points 89

L'utilisation de -XX:+UseParNewGC avec -XX:+UseConcMarkSweepGC entraînera un temps de pause plus long pour les GC mineurs, par rapport à -XX:+UseParallelGC.

En effet, la promotion d'objets de la jeune à l'ancienne génération nécessitera l'exécution d'un algorithme Best-Fit (en raison de la fragmentation de l'ancienne génération) pour trouver une adresse pour cet objet.
L'exécution d'un tel algorithme n'est pas nécessaire lors de l'utilisation de -XX:+UseParallelGC, car +UseParallelGC ne peut être configuré qu'avec MarkandCompact Collector, auquel cas il n'y a pas de fragmentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X