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?
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.
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:
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.
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.