Odśmiecanie pamięci po Jawie 9

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

100
50

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 4 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:ParallelGCThreads=<n> 
‑XX:+CMSConcurrentMTEnabled ‑XX:ConcGCThreads=<n> 

‑XX:+UseCMSInitiatingOccupancyOnly 
‑XX:CMSInitiatingOccupancyFraction=70 
-XX:CMSBootstrapOccupancy=10 
-XX:+CMSIncrementalMode 

‑XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 
‑XX:+ExplicitGCInvokesConcurrent 
-XX:+CMSClassUnloadingEnabled

-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()…​

Źródła

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

1. Fajna zabawa, 20 minut i dużo się można nauczyć

Ź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óżnych 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>

J21 przywraca pokolenia
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), kolorowanie wskaźników, uwzględnia NUMA

  6. współbieżne procesowanie finalizacji i (J16) stosów wątków

Ź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ść

A przestrzeń meta?

Ta prezentacja świadomie pomija temat, ale dla chcących go zgłębić zalecam JEP387, wprowadzony w J16, o elastycznej przestrzeni meta.

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: Z i Shenandoah

Dziękuję Wam!

Tomasz Borek @LAFK_pl