Używanie ZGC z wieloterabajtowymi stertami może mieć kilka konsekwencji w zakresie wydajności:
1. Niskie opóźnienia: ZGC zaprojektowano tak, aby minimalizować czasy przerw, zapewniając, że aplikacja pozostaje responsywna nawet przy dużych stosach. Osiąga to poprzez wykonywanie większości prac związanych z usuwaniem elementów bezużytecznych jednocześnie z aplikacją, co skutkuje czasem pauzy krótszym niż 10 ms [3] [4].
2. Wysoka przepustowość: ZGC został zaprojektowany, aby zapewnić wysoką przepustowość poprzez minimalizację czasu spędzanego na zbieraniu śmieci. Dzięki temu aplikacja może nadal działać wydajnie nawet przy dużym obciążeniu pamięci[2] [4].
3. Multi-mapowanie: ZGC wykorzystuje wielokrotne mapowanie do mapowania różnych zakresów pamięci wirtualnej na tę samą pamięć fizyczną. Może to prowadzić do zwiększonego zużycia pamięci, ponieważ system operacyjny może zgłosić 3 razy większe wykorzystanie pamięci z powodu dodatkowych mapowań[1].
4. Kolorowe wskaźniki: ZGC używa kolorowych wskaźników do przechowywania metadanych we wskaźnikach 64-bitowych. Może to spowodować dodatkową pracę podczas wyłuskiwania wskaźników, ale technika wielokrotnego mapowania pomaga złagodzić ten narzut[2].
5. NUMA-Aware: ZGC zaprojektowano tak, aby obsługiwał NUMA, co oznacza, że może wydajnie obsługiwać duże sterty i wiele rdzeni procesora. Gwarantuje to, że moduł zbierający elementy bezużyteczne będzie mógł wykorzystać dostępne zasoby sprzętowe [2] [4].
6. Opcje dostrajania: ZGC ma kilka opcji dostrajania, takich jak ustawienie maksymalnego rozmiaru sterty i liczby jednoczesnych wątków GC. Opcje te mogą pomóc zrównoważyć wykorzystanie pamięci i wydajność usuwania elementów bezużytecznych[3] [4].
7. Funkcja eksperymentalna: ZGC jest funkcją eksperymentalną i do jej włączenia wymagane są określone opcje wiersza poleceń. Nadaje się do aplikacji wymagających bardzo krótkich czasów pauzy i może obsługiwać duże alokacje pamięci [1] [3].
Podsumowując, użycie ZGC z wieloterabajtowymi stertami może zapewnić niskie opóźnienia, wysoką przepustowość i wydajne zarządzanie pamięcią. Wymaga to jednak starannego dostrojenia i może prowadzić do zwiększonego zużycia pamięci z powodu wielokrotnego mapowania.
Cytaty:[1] https://stackoverflow.com/questions/62926652/the-Java-zgc-garbage-collector-uses-a-lot-of-memory
[2] https://www.opsian.com/blog/javas-new-zgc-is-very-exciting/
[3] https://docs.oracle.com/en/java/javase/11/gctuning/z-garbage-collector1.html
[4] https://developers.redhat.com/articles/2021/11/02/how-choose-best-java-garbage-collector
[5] https://dzone.com/articles/java-z-garbage-collector-zgc-a-deep-dive-with-exam