Différence entre-XX: UseParallelGC et-XX: + UseParNewGC
ce sont des algorithmes pour la collecte des ordures de la jeune génération.
la seconde (UseParNewGC) est activée automatiquement avec la génération concurrente de génération de déchets tenure (voir Java Concurrent et parallèle GC ) mais, y a-t-il une différence entre les deux algorithmes parallèles?
4 réponses
après de nombreuses recherches, la meilleure explication que j'ai trouvée est celle du site Web Java Performance Tuning dans Question du mois: 1.4.1 algorithmes de collecte des ordures, 29 janvier 2003
algorithmes de collecte des ordures de la jeune génération
Le (original) copie collector (Activé par défaut). Lorsque ce collecteur entre en action, toutes les applications les threads sont arrêtés, et la collecte des copies se fait en utilisant un thread (ce qui signifie un seul CPU, même sur une machine multi-CPU). C'est ce qu'on appelle une collection "stop-the-world", parce que la JVM fait une pause dans tout le reste jusqu'à ce que la collection soit terminée.
le collecteur de copie parallèle (activé en utilisant-XX:+UseParNewGC). Comme l'original copying collector, il s'agit d'un collector stop-the-world. Cependant ce collecteur met en parallèle la collection de copies sur fils multiples, qui est plus efficace que le collecteur original de copies à fil simple 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, lorsqu'on le compare au collecteur original à filetage unique.
the parallel scavenge collector (activé en utilisant-XX:UseParallelGC). C'est comme le collecteur de copie parallèle précédent, mais l'algorithme est réglé pour des 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 a une politique d'ajustement adaptative optionnelle qui redimensionne automatiquement les espaces de tas. Si vous utilisez ce collecteur, vous ne pouvez utiliser le collecteur original de marque-balayage dans la vieille génération (c.-à-d. la nouvelle génération collecteur concurrent ne peut pas travailler avec cette jeune génération collecteur.)
de cette information, il semble que la principale différence (en dehors de la coopération CMS) est que UseParallelGC prend en charge ergonomie alors que UseParNewGC ne le fait pas.
- XX:+UseParallelGC Utilisation parallèle de collecte des ordures pour les neutralise. (Introduit au 1.4.1)
- XX: + UseParallelOldGC utiliser la collecte des ordures en parallèle pour les collectes complètes. Activer cette option permet de définir automatiquement-XX:+UseParallelGC. (Introduit dans la mise à jour 5.0 6.)
UseParNewGC Une version parallèle du collecteur de copies de la jeune génération est utilisée avec le collecteur concurrent (i.e. if-XX:+ UseConcMarkSweepGC est utilisé sur la ligne de commande alors le drapeau UseParNewGC est aussi défini à true si elle n'est pas définie explicitement sur la ligne de commande).
peut-être que la façon la plus facile de comprendre était les combinaisons d'algorithmes de collecte des ordures faites 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:
- s'Applique -XX:+UseParallelGC lorsque vous avez besoin de collection parallèle méthode plus JEUNES génération SEULEMENT , ( mais encore) de série à usage-marque-méthode du balayage VIEUX génération de la collection
- appliquer-XX:+UseParallelOldGC lorsque vous avez besoin de parallèle méthode de collecte sur jeune génération (fixe automatiquement-XX:+UseParallelGC) et Vieux collection génération
- Apply-XX:+UseParNewGC & - XX:+UseConcMarkSweepGC lorsque vous avez besoin de la méthode de collecte parallèle sur jeune génération et nécessitent la méthode CMS comme votre collection sur Vieux mémoire de génération
- Vous ne pouvez pas appliquer de -XX:+UseParallelGC ou -XX:+UseParallelOldGC avec -XX:+UseConcMarkSweepGC simultanément, c'est pourquoi votre besoin-XX:+UseParNewGC être jumelé avec la CMS, sinon utilisez -XX:+UseSerialGC explicitement OU -XX: - UseParNewGC si vous souhaitez utiliser la méthode d'une série à l'encontre des jeunes de la génération
UseParNewGC généralement connu comme" parallel young generation collector " est le même en tous points que le collecteur de déchets parallèle (-XX:+UseParallelGC), sauf que son plus sophistiqué et efficace. En outre, il peut être utilisé avec un "collecteur de faible pause concurrent".
Voir Java GC FAQ , la question 22 pour plus d'informations.
notez qu'il y a des bogues connus avec UseParNewGC
en utilisant-XX: + UseParNewGC avec-XX:+UseConcMarkSweepGC, provoquera un temps de pause plus élevé pour les GCs mineurs, par rapport à-XX:+UseParallelGC.
c'est parce que, la promotion des objets de la jeune à la vieille génération exigera l'exécution D'un algorithme le mieux adapté (en raison de la fragmentation de la vieille génération) pour trouver une adresse pour cet objet.
L'exécution d'un tel algorithme n'est pas nécessaire lorsque vous utilisez-XX:+UseParallelGC, car +UseParallelGC peut être configuré uniquement avec Marketcompact Collector, auquel cas il n'y a pas de fragmentation.