Jak działa G1?

Wpis jest z lotu ptaka. Chcecie dokładniej, dawajcie następne pytania. 🙂 Czego tu nie ma: faz, pokręteł, zbiorów i podobnych detali technicznych.

Skrót:

  1. pokoleniowo
  2. regionalizując stertę
  3. przypisując regionom rodzaje
  4. mając region dla olbrzymów
  5. często odśmieca młodych
  6. czasem odśmieca mieszanie
  7. miewa nieudane ewakuacje (problem!)
  8. gdy odśmieca, to regiony z największą ilością śmieci (stąd nazwa)

Pokoleniowo

1. większość obiektów umiera młodo
2. co nie umiera młodo, długo żyje
3. nie ma zbyt wielu połączeń między młodymi a starymi (G1 niekoniecznie?)

G1 się wyłamuje z tego nieco: ma region dla olbrzymów, nie cała alokacja trafia do EDENu, czasem miesza pokolenia gdy odśmieca. No i regionalizuje stertę, zamiast po prostu podzielić ją jak inni: na lewo młodzi, na prawo starzy.

Regionalizacja sterty

1. Sterta dzielona jest na regiony, <=2048.
2. Regiony są w rozmiarach od 1-32MB

Niektóre źródła mówią, że regionów ma być około 2048.

Rodzaje regionów

  • EDEN – tu alokacja (z wyjątkiem)
  • SURVIVOR – jak kto przeżył odśmiecanie, to jest ocaleńcem, bo raczej nie przeżytkiem ;P
  • TENURED – stare pokolenie
  • HUMONGOUS – dla olbrzymów, tu alokacja wyjątkowa

EDEN i SURVIVOR to młode pokolenie.

G1RegionyPokolorowane

Region dla olbrzymów

  1. Technicznie rzecz biorąc, ten region też należy do starego pokolenia.
  2. Jak obiekt ma rozmiar jak pół regionu (lub większy), to jest olbrzymem.
  3. Olbrzym jest alokowany wyjątkowo, bo w regionie dla olbrzymów. Region dla olbrzymów to np. 2 zwykłe regiony (obok siebie, ciągła alokacja).
  4. Jak olbrzym ma rozmiar regionu z kawałkiem, to i tak zapisany zostanie do dwu regionów.
  5. Na powyższym obrazku zaalokowaliśmy dwa olbrzymy, jeden zawiera się w dwu regionach, drugi w trzech.
  6. Nieważne, czy olbrzym zajmie 2,1 czy 2,9, tracisz 3 regiony. Ta strata może prowadzić do fragmentacji starej generacji.
  7. Martwe olbrzymy sprzątamy podczas pełnego odśmiecania.
  8. Olbrzymów nie kopiujemy (są olbrzymami!) tylko kompaktujemy.

Ostatni punkt nabierze większego znaczenia jak przeczytacie następną sekcję.

Odśmiecanie młodych

  1. Jeśli alokujemy nie-olbrzyma to do EDENu.
  2. Młode pokolenie to noworodki i ocaleńcy, którzy nie są dość starzy (nie przeżyli dostatecznie wielu odśmiecań): czyli regiony rodzajów: EDEN, SURVIVOR.
  3. Pracujemy na regionach z poprzedniego odśmiecania (pierwsza kolekcja EDEN, druga EDEN i te regiony SURVIVOR jakie zapisaliśmy, itd.).
  4. Żywe obiekty kopiujemy (w żargonie śmieciarza: ewakuujemy) do nowych regionów.
  5. Zależnie od ich wieku (ilości przeżytych odśmiecań), będzie to albo region typu SURVIVOR albo TENURED.
  6. Przeniesienie z młodego do starego pokolenia nazywamy promocją.

G1GC dostosowuje ilość regionów konkretnego typu by czas odśmiecania w młodej generacji był lepszy (czytaj: bardziej zgodny z ustawieniami pokręteł dotyczących pauz).

Odśmiecanie mieszane

Współbieżnie z aplikacją, G1 oznacza obiekty żywe. Gdy to oznaczanie się skończy, miast odśmiecania młodych, mamy odśmiecanie mieszane. Mieszane, bo dodajemy niektóre stare regiony do zestawu regionów, które odśmiecamy. Które i ile kontroluje się pokrętłami. Wiem, że któryś już raz NIE piszę o pokrętłach, ale pokręteł jest NAPRAWDĘ sporo, a wpis jest z lotu ptaka.

Mieszane odśmiecanie jest przyrostowe i ma na celu odśmiecić wystarczająco duży obszar starego pokolenia. Potem G1 wraca do odśmiecania młodych i oznaczania żywych obiektów.

Nieudana ewakuacja

Problemem w G1 jest nieudana ewakuacja, czyli gdy nie mamy regionów by do nich skopiować żywe obiekty, bo musimy wtedy powtórzyć szereg kosztownych czynności:

  • kontynuować odśmiecanie (nadal trzeba zwolnić przestrzeń)
  • czego nie możemy skopiować, musimy promować (w miejscu)
  • księgowość G1 trzeba zaktualizować, a właściwie przegenerować na nowo

Zwykle to unikasz pokrętłami a najprościej zwiększając rozmiar sterty. Dokładnie jak tego uniknąć zależy od powodów dla których się to zdarzyło.

Wpierw śmieci

Gdy G1GC stwierdza, że czas działać, to zbiera regiony z największą ilością śmieci. Stąd nazwa: garbage first – G1.

Podsumowanie

G1 regionalizuje stertę, regiony są przypisane do rodzaju, odśmiecania są (częste) u młodych lub mieszane. Wyrzuca wpierw śmieci, czyli zaczyna od regionów z największą ilością obiektów martwych (nieosiągalnych).

By nie mieć problemów, jakie powstają przy alokacji dużych obiektów i przedwczesnych promocjach gdy te się nie mieściły, G1 ma region specjalnie dla takich przypadków.

G1 jest następcą CMSa: też stawia na współdziałane z aplikacją, na nieblokowanie jej. Tak jak CMS ma ConcurrentModeFailure, tak G1GC ma EvacuationFailure.

Jest to też algorytm, który dostosowuje rozmiary obszarów (przez ilość regionów do danej etykiety przypisanych) tak, by móc zrealizować postawione przed nim cele: czas pauzy czy przepustowość.

Jeśli zastanawiacie się, jak dobry jest G1, to jak pytałem Simone Bordet o porównanie z najlepszym – bo prawie bezpauzowym – Zingowym algorytmem, Simone powiedział, że to jak porównanie Passata do BMW (teraz czekam na ludzi z wypas Passatami piszących oburzone komentarze). Czyli: niezły.

Więcej:

  • Monica Beckwith
  • Simone Bordet
  • Oraclowe materiały (część przez Monicę pisana)
  • Wasze linki i doświadczenie?
Advertisements

2 Comments

  1. Zrozumiały, ale trochę chaotyczny opis jak działa G1, plus są dwa kawałki po angielsku, jakbyś zapomniał je przetłumaczyć 🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s