Różnica między -XX: + UseParallelGC i -XX: + UseParNewGC

83

Są to algorytmy do zbierania śmieci młodego pokolenia.

Drugi (UseParNewGC) jest aktywowany automatycznie wraz z wyrzucaniem elementów bezużytecznych na czas współbieżnej generacji (zobacz Java Concurrent i Parallel GC ), ale czy istnieje różnica między dwoma równoległymi algorytmami?

fglez
źródło

Odpowiedzi:

119

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.

fglez
źródło
3
Nieco bardziej aktualny link szybszyj.com/articles/oraclecollectors1.shtml
phunehehe
@phunehehe Dzięki za link! To bardzo pomocne.
The Student Soul
21

Równoległe GC

  • XX: + UseParallelGC Użyj równoległego wyrzucania elementów bezużytecznych do oczyszczania. (Wprowadzone w 1.4.1)
  • XX: + UseParallelOldGC Użyj równoległego wyrzucania elementów bezużytecznych dla pełnych kolekcji. Włączenie tej opcji automatycznie ustawia -XX: + UseParallelGC. (Wprowadzone w aktualizacji 5.0 6.)

UseParNewGC

UseParNewGC Równoległa wersja kolektora kopiowania młodej generacji jest używana z kolektorem współbieżnym (tj. Jeśli -XX: + UseConcMarkSweepGC jest używane w wierszu poleceń, to flaga UseParNewGC jest również ustawiana na true, jeśli nie jest jawnie ustawiona w wierszu poleceń ).

Być może najłatwiejszym sposobem zrozumienia były kombinacje algorytmów zbierania śmieci stworzone przez Alexeya Ragozina

Wniosek:

  1. Zastosuj -XX: + UseParallelGC, gdy potrzebujesz równoległej metody zbierania na TYLKO MŁODYCH generacji , ( ale nadal) użyj metody serii-mark-sweep jako kolekcji OLD generacji
  2. Zastosuj -XX: + UseParallelOldGC gdy wymagają metody gromadzenia równolegle nad YOUNG generacji (automatycznie ustawia -XX: + UseParallelGC) I OLD kolekcja generacji
  3. Zastosuj -XX: + UseParNewGC & -XX: + UseConcMarkSweepGC gdy wymagają równoległego metodę gromadzenia nad YOUNG generacji I wymagają metody CMS jako swojej kolekcji ponad OLD pamięci generacji
  4. Nie możesz jednocześnie zastosować -XX: + UseParallelGC lub -XX: + UseParallelOldGC z -XX: + UseConcMarkSweepGC, dlatego wymagasz sparowania -XX: + UseParNewGC z CMS, w przeciwnym razie użyj -XX: + UseSerialGC jawnie LUB -XX : - UseParNewGC, jeśli chcesz użyć metody seryjnej przeciwko młodemu pokoleniu
Ivan Herlambang
źródło
Musi być -XX:-UseParallelGC.
Minas Mina
Uwaga: Wniosek nr 1 nie jest już poprawny. Zastosowanie -XX:+UseParallelGCprowadzi do użycia równoległego GC zarówno dla młodego, jak i starego GC dla nowoczesnych maszyn JVM. Zobacz bugs.openjdk.java.net/browse/…
turbanoff
15

UseParNewGC zwykle znany jako „równoległy zbieracz młodego pokolenia” jest taki sam pod każdym względem jak równoległy moduł zbierający elementy bezużyteczne (-XX: + UseParallelGC), z wyjątkiem tego, że jest bardziej wyrafinowany i wydajny. Może być również używany z „współbieżnym kolektorem o niskiej przerwie”.

Zobacz temat Java GC FAQ , pytanie 22, aby uzyskać więcej informacji.

Zauważ, że w UseParNewGC jest kilka znanych błędów

Suraj Chandran
źródło
8
Czy wiesz, jakie znane błędy lub w której wersji JVM je zawierają?
fglez
4

Użycie -XX: + UseParNewGC razem z -XX: + UseConcMarkSweepGC spowoduje dłuższy czas przerwy dla drugorzędnych GC w porównaniu z -XX: + UseParallelGC.

Dzieje się tak, ponieważ promocja obiektów z Young do Old Generation będzie wymagała uruchomienia algorytmu Best-Fit (ze względu na fragmentację starej generacji) w celu znalezienia adresu dla tego obiektu.
Uruchamianie takiego algorytmu nie jest wymagane w przypadku korzystania z -XX: + UseParallelGC, ponieważ + UseParallelGC można skonfigurować tylko z MarkandCompact Collector, w którym to przypadku nie ma fragmentacji.

Avinash Ganta
źródło
To naprawdę dobry wgląd. Czy wykonałeś jakieś testy, aby to potwierdzić?
fglez