Odśmiecanie pamięci, Jawa 9 - 15

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

logo 4Dev

logo EPAMu

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, 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

Dziś z ramienia EPAM

logo Akademii nad logo EPAMu
  1. http://epa.ms/jap

  2. 1 X 2020 - 9 edycja Akademii Java,

  3. obecnie udzielam się w Pre-Akademii (Java Online).

Odśmiecanie w 3 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 ⇒ długość zbiórki (pauzy)

Ź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

  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

  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: 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ę Państwu

Tomasz Borek @LAFK_pl

Zwiastun: bezpieczna Jawa