web-dev-qa-db-fra.com

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

Ce sont des algorithmes pour la collecte de déchets jeune génération.

Le second (UseParNewGC) est activé automatiquement avec le garbage collection de génération permanente simultanée (voir GC simultané et parallèle GC ), mais existe-t-il une différence entre les deux algorithmes parallèles?

80
fglez

Après de nombreuses recherches, la meilleure explication que j'ai trouvée provient de Java consacré au réglage des performances dans La question du mois: 1.4.1 Algorithmes de récupération de place, le 29 janvier 20

Algorithmes de récupération de place de la jeune génération

Le collecteur de copie (original) (activé par défaut). Lorsque ce collecteur démarre, tous les threads de l'application sont arrêtés et la collection de copie utilise un seul thread (ce qui signifie un seul processeur, même sur un ordinateur à plusieurs processeurs). C'est ce qu'on appelle une collection stop-the-world, car fondamentalement, la machine virtuelle Java met tout le reste en pause jusqu'à ce que la collection soit terminée.

Le collecteur de copie parallèle (activé à l'aide de -XX: + UseParNewGC). Comme le collecteur de copie d'origine, il s'agit d'un collecteur stop-the-world. Toutefois, ce collecteur parallélise la collection de copie sur plusieurs threads, ce qui est plus efficace que le collecteur de copie à un seul thread d'origine pour les ordinateurs à plusieurs processeurs (mais pas pour les ordinateurs à un seul processeur). Cet algorithme peut potentiellement accélérer la collecte des nouvelles générations d'un facteur égal au nombre de processeurs disponibles, par rapport au collecteur de copie à thread unique associé à l'origine.

Le collecteur de nettoyage parallèle (activé à l'aide de -XX: UseParallelGC). Cela ressemble au collecteur de copie parallèle précédent, mais l'algorithme est réglé pour des tas de gigaoctets (plus de 10 Go) sur des ordinateurs à plusieurs processeurs. Cet algorithme de collecte est conçu pour maximiser le débit tout en minimisant les pauses. Il a une politique facultative de réglage adaptatif qui redimensionnera automatiquement les espaces de tas. Si vous utilisez ce collecteur, vous ne pouvez utiliser que le collecteur de marques et balayages d'origine de l'ancienne génération (c'est-à-dire que le collecteur simultané de nouvelle génération de dernière génération ne peut pas fonctionner avec ce collecteur de nouvelle génération).

À partir de ces informations, il semble que la principale différence (hormis la coopération du système de gestion de contenu) réside dans le fait que UseParallelGC prend en charge ergonomie alors que UseParNewGC ne le fait pas.

116
fglez

GC parallèle

  • XX: + UseParallelGC Utilisez la récupération de place parallèle pour les nettoyages. (Introduit dans 1.4.1)
  • XX: + UseParallelOldGC Utilisez une récupération de place parallèle pour les collections complètes. L'activation de cette option définit automatiquement -XX: + UseParallelGC. (Introduit dans la mise à jour 5.0 6.)

seParNewGC

UseParNewGC Une version parallèle du collecteur de copie de nouvelle génération est utilisée avec le collecteur simultané (c'est-à-dire si -XX: + UseConcMarkSweepGC est utilisé sur la ligne de commande, puis le flag UseParNewGC est également défini sur true s'il n'est pas défini explicitement autrement sur la ligne de commande).

Le moyen le plus facile à comprendre consistait peut-être à combiner des algorithmes de collecte des ordures créé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 -XX: + UseParallelGC lorsque vous avez besoin d'une méthode de collecte parallèle sur [~ # ~] jeune [~ # ~] génération [~ # ~] uniquement [ ~ # ~] , ( mais continuez) utilisez la méthode serial-mark-sweep comme [~ # ~] ancien [~ # ~] collection de générations
  2. Appliquez -XX: + UseParallelOldGC lorsque vous avez besoin d’une méthode de collecte parallèle sur [~ # ~] jeune [~ # ~] génération (définit automatiquement -XX: + UseParallelGC) [~ # ~] et [~ # ~] [~ # ~] ancien [~ # ~] collection de générations
  3. Appliquez -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC lorsque vous avez besoin d'une méthode de collecte parallèle sur [~ # ~] young [~ # ~] génération [ ~ # ~] et [~ # ~] requièrent une méthode CMS pour votre collection sur [~ # ~] ancien [~ # ~] mémoire de génération
  4. Vous ne pouvez pas appliquer simultanément -XX: + UseParallelGC ou -XX: + UseParallelOldGC avec -XX: + UseConcMarkSweepGC, vous devez donc utiliser -XX: + UseParNewGC avec CMS, sinon utilisez -XX: + UseSerialGC explicitement [~ # ~] ou [~ # ~] -XX: - UtilisezParNewGC si vous souhaite utiliser la méthode en série contre la jeune génération
20
Ivan Herlambang

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

Voir FAQ Java GC , question 22 pour plus d'informations.

Notez qu'il existe des bogues connus avec UseParNewGC.

15
Suraj Chandran

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

En effet, la promotion des objets de la jeune génération à l'ancienne génération nécessitera l'exécution d'un algorithme de meilleur ajustement (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 avec -XX: + UseParallelGC, car + UseParallelGC peut être configuré uniquement avec MarkandCompact Collector, auquel cas il n'y a pas de fragmentation.

3
Avinash Ganta