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.