Po wielu poszukiwaniach najlepsze wyjaśnienie, jakie znalazłem, pochodzi z witryny Java Performance Tuning w pytaniu miesiąca: 1.4.1 Algorytmy zbierania śmieci, 29 stycznia 2003 r.
Algorytmy zbierania śmieci młodej generacji
Kolektor (oryginalna) kopiowanie (domyślnie włączone). Po uruchomieniu tego modułu zbierającego wszystkie wątki aplikacji są zatrzymywane, a kolekcja kopiowania przebiega przy użyciu jednego wątku (co oznacza tylko jeden procesor, nawet jeśli jest to maszyna wieloprocesorowa). Nazywa się to zbieraniem typu „stop-the-world”, ponieważ w zasadzie maszyna JVM wstrzymuje wszystko inne do czasu zakończenia zbierania.
Równolegle kolektor kopiowania (uaktywnione za -xx: + UseParNewGC). Podobnie jak oryginalny kolekcjoner kopii, jest to kolekcjoner typu stop-the-world. Jednak ten kolektor równolegle kopiuje kolekcję w wielu wątkach, co jest bardziej wydajne niż oryginalny moduł zbierający kopiowanie jednowątkowe dla maszyn z wieloma procesorami (choć nie dla maszyn z jednym procesorem). Algorytm ten potencjalnie przyspiesza zbieranie danych przez młode pokolenie o współczynnik równy liczbie dostępnych procesorów w porównaniu z oryginalnym kolektorem kopiowania z pojedynczym wątkiem.
Równolegle kolektor przedmuch (uaktywnione za -xx: UseParallelGC). Jest to podobne do poprzedniego kolektora równoległego kopiowania, ale algorytm jest dostrojony do stosów gigabajtów (ponad 10 GB) na maszynach wieloprocesorowych. Ten algorytm zbierania ma na celu maksymalizację przepustowości przy jednoczesnej minimalizacji przerw. Posiada opcjonalną strategię dostrajania adaptacyjnego, która automatycznie zmienia rozmiar przestrzeni sterty. Jeśli używasz tego kolektora, możesz używać tylko oryginalnego kolektora mark-sweep w starej generacji (tzn. Współbieżny kolektor nowej generacji nie może współpracować z tym kolektorem młodej generacji).
Z tych informacji wynika, że główna różnica (poza współpracą z CMS) polega na tym, że UseParallelGC obsługuje ergonomię, a UseParNewGC nie.