Odśmiecanie pamięci, Jawa 9 - 15

Żegnamy CMS, domyślny jest G1, dochodzą Epsilon, Shenandoah i ZGC. Który (i kiedy) wybrać?

logo WJUG

Tomasz Borek, @LAFK pl,

Start

CO WYBRAĆ?! JAK ŻYĆ?! (to zależy oczywiście)

  1. CMS i trzymamy się wersji gdzie on jeszcze jest?

  2. G1 bo wystarczy albo nawet lepiej pasuje?

  3. Shenandoah, wiele TB sterty, Red Hat potrafi?

  4. Epsilon - śmieciarz co nie odśmieca

  5. ZGC - wiele TB sterty, bezwzględnie niskopauzowy?

Agenda

  1. o mnie

  2. odśmiecanie pamięci w 3 slajdach

  3. CMS, G1GC

  4. Epsilon, Shenandoah, ZGC

  5. podsumowanie

O mnie

LAFK pl

Ja w sieci

LAFK pl wSieci

Zlecenia

  1. audyty kodu, infrastruktury, komponentów, systemu

  2. testy i audyty wydajności czy bezpieczeństwa

  3. wchodzę w bazy danych, GNU/Linuxy, sieci czy bezpiekę

  4. programy na zlecenie

  5. prelekcje, wykłady tematyczne, warsztaty, szkolenia

Pytania?

question mark

Odśmiecanie w 4 slajdach

Znakomita większość obiektów umiera młodo.

— hipoteza pokoleniowa
orgPamięci
Organizacja pamięci (uproszczona)

Osiągalność

osiągalność
A co jak wątki aplikacji wtedy hasają?

Wnioski

  1. każda zbiórka:

    1. pauzuje (stopuje świat, zatrzymuje wątki apki)

    2. czyści Eden

    3. i przerzuca pomiędzy ocaleńcami (o2 i o1)

  2. promocja to przerzutka z młodego do starego

    1. przedwczesna jak brak miejsca w ocaleńcach

  3. rozmiar sterty, ilość żywych, ilość korzeni ⇒ długość zbiórki (pauzy)

Strategie

  1. przepustowość (równoleglenie) - rzadko pauza, ale potencjalnie duża

  2. responsywność (współbieżność) - dużo małych pauz, niezauważalnych

Źródła

Pytania?

question mark

CMS (do 14)

Concurrent Mark-Sweep - czyli bez Compact

współbieżnie z wątkami apki, reaktywność
ConcurrentModeFailure bywa zabójczy
  1. By użyć: ‑XX:+UseConcMarkSweepGC

  2. By stroić: hmmm, momencik, parsuję…​ 20 flag

By stroić:

-Xmx<size> ‑XX:+UseParNewGC

‑XX:+UseCMSInitiatingOccupancyOnly ‑XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSIncrementalMode -XX:CMSBootstrapOccupancy=10
‑XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses ‑XX:+ExplicitGCInvokesConcurrent -XX:+CMSClassUnloadingEnabled
‑XX:+CMSConcurrentMTEnabled ‑XX:ConcGCThreads=<n> ‑XX:ParallelGCThreads=<n>

-XX:CMSTriggerRatio=70 -XX:CMSTriggerPermRatio=90 -XX:CMSWaitDuration=2000

-XX:+CMSParallelRemarkEnabled -XX:+CMSParallelSurvivorRemarkEnabled -XX:+CMSScavengeBeforeRemark
-XX:+CMSScheduleRemarkEdenSizeThreshold -XX:CMSScheduleRemarkEdenPenetration=20
-XX:CMSScheduleRemarkSamplingRatio=4 -XX:CMSRemarkVerifyVariant=1

Jawa 14 pożegnała CMS, algorytm który wciąż potrafił i osiągał, ale którego utrzymanie było conajmniej problematycznie.

Technikalia

  1. ConcurentModeFailure - szeregowo po starym pokoleniu po fragmentacji pamięci

  2. dobre dla okienkowców (np. Intellij używa) - nie zamarznie interfejs

  3. dużo pokręteł! wyładowuje klasy, współbieżny z apką, na stare pokolenie, istotne jaki partner w młodym pokoleniu, System.gc()…​

Pytania?

question mark

G1GC (8)

Wpierw śmieci, czyli Garbage 1(st)

regionalizacja sterty - redefiniuje i uwspółbieżnia pokoleniowość
  1. By użyć: nic (domyślny) lub -XX:+UseG1GC

  2. By stroić: rozmiar sterty, ilość i rozmiar regionów (12 flag)

Jak to działa?

  1. dobierasz ile regionów (2048-) i o jakim rozmiarze (1-32MB)

  2. alokacja jest w Edenie i obszarach dla olbrzymów

  3. G1 prowadzi buchalterię per region

  4. pokolenia są rozbite a nie ciągłe

Regionalizacja

ilustracja regionalizacji sterty - obraz ukazuje pokolorowane regiony

  1. niezależne, mniejsze zbiórki

  2. młode, stare, mieszane

Ergonomia - wolne regiony

ilustracja regionalizacji sterty - obraz ukazuje pokolorowane regiony

  1. rośnie czego potrzeba

  2. ewakuacja oddaje region

Koniec przedwczesnej promocji

ilustracja regionalizacji sterty - obraz ukazuje pokolorowane regiony

  1. olbrzymy i Eden to alokacja

  2. min pół regionu

  3. 2,1 czy 2,9 i tak 3

Technikalia

  1. zastępca CMSa, domyślny algo od Jawy 9,

  2. wypuszczony w 2006, dojrzały teraz

  3. regionalizacja sterty

  4. dużo ciekawych zmian i usprawnień doprowadzających go do poziomu wyrafinowania poprzedników

  5. optymalizacje na jakie G1 może sobie pozwolić

Źródła

Pytania?

question mark

Epsilon GC (11)

ε w językach formalnych w informatyce oznacza pusty napis ("")

Na wszystkie sytuacje, kiedy marzy Ci się algo co…​ NIC NIE ROBI (JDK11+)
  1. By użyć: -XX:+UseEpsilonGC -XX:+UnlockExperimentalVMOptions

  2. By stroić: …​

Technikalia

Śmieciarz ma heurystyki startu, prowadzi buchalterię, znajduje korzenie, chodzi po grafie obiektów, pauzuje świat, zlicza referencje, uważa na cykle, odpowiada za alokację i - nomen omen - odśmiecanie pamięci, robi analizę osiągalności, używa barier…​

Epsilon dba o alokację. Reklamacja pamięci? To nie jego broszka.

Po co?

  1. testy wydajnościowe bez śmieciarza

  2. testy kiedy apka zeżre pamięć

  3. testy interfejsu odśmiecania

  4. robienie własnego śmieciarza [1]

  5. start, szybka lecz ostra praca, koniec

  6. nauka

Źródła

Własny śmieciarz

Pytania?

question mark

Shenandoah (15, od 12, +8 +11)

O Shenandoah, jej imię było…​

Nie OracleJDK.
  1. By użyć: -XX:+UseShenandoahGC -XX:+UnlockExperimentalVMOptions

  2. By stroić: jest rekomendowana konfiguracja

Rekomendowana konfiguracja:

-XX:+AlwaysPreTouch -Xmx<X> -Xms<X>
-XX:+UseLargePages
-XX:+UseNUMA -XX:-UseBiasedLocking -XX:+DisableExplicitGC

Regiony inaczej

shenandoah gc cycle
Za: Wiki projektu

Technikalia

  1. współbieżnie ewakuuje obiekty

  2. współbieżnie aktualizuje referencje do obiektów

  3. sterty róznych rozmiarów mają podobne pauzy

  4. współbieżny i równoległy i jednopokoleniowy

  5. pauzy podyktowane są głównie rozmiarem zbioru korzeni

Źródła

Pytania?

question mark

ZGC (15, od 11)

Zee or Zed, both pronounciation are fine. Z stands for 'the'…​ not.

  1. By użyć: -XX:+UseZGC -XX:+UnlockExperimentalVMOptions

  2. By stroić: -Xmx<size> -XX:ConcGCThreads=<nr>

ile wątków? heurystyka nieźle daje radę

Po co nam ZGC?

  1. wielo-TB sterty

  2. max pauza: 10ms

  3. współbieżny z apką, jak CMS

  4. utrata przepustowości apki: max 15%

Czas pauzy nie rośnie kiedy rośnie sterta lub ilość osiągalnych obiektów

Czas pauzy

wykres słupkowy gdzie Z wygrywa z G1 i Parallel mając krótsze pauzy
za: Per Lid, Stefan Karlsson

Technikalia

  1. współbieżnie wyładowuje klasy - BEZ PAUZY

  2. zwraca nieużywaną pamięć

  3. sterta od 8MB do 16TB

  4. współbieżny i równoległy i jednopokoleniowy

  5. bariery odczytu (load barriers)

  6. kolorowanie wskaźników

  7. uwzględnia NUMA

  8. współbieżne procesowanie finalizacji

Źródła

Pytania?

question mark

Podsumowując!

  1. CMS współbieżnie oznacza, ale!

    1. kopiuje młodych przy pauzach

    2. bez kompresji starego pokolenia

    3. ConcurrentModeFailure - seryjnie

  2. G1 bez współbieżnej ewakuacji, pauza na kompresję

    1. nie gwarantuje czasów pauz

Nowe pokolenie algorytmów, od J11

  1. równolegle i współbieżnie

  2. jednopokoleniowo

  3. słabiej przepustowość, szybszy czas odpowiedzi

  4. większe sterty

Wydajność

IonutBalosin java garbage collector types

Z vs Shenandoah?

przedwczesne pytanie:

Z wciąż usprawniany, wiele podobieństw obu (cele!), która Jawa? 11? 12? 13? 14? 15? 16?, jaka apka (co robi), jak bardzo potrzebna jest NUMA, testy Balosina z 13tki i syntetyczne, brak wieści z branży

*testujcie!

  1. CMS: do 14, okienkowce i reaktywność, dużo strojenia

  2. G1: 8, 9 domyślny, regionalizacja sterty, dojrzały

  3. eksperymentalne:

    1. Epsilon: od 11, tylko alokuje i nic więcej

    2. Shenandoah: od 12, nie Oracle JDK, niskie pauzy

    3. ZGC od 11 do 14, bezwzględnie niskie pauzy, TB sterty

  4. Java 15 (GA niedawno!): Z i Shenandoah

Dziękuję Wam!

Tomasz Borek @LAFK_pl

Zwiastun: bezpieczna Jawa