Algorytmy GC: Serial, G1, ZGC, Shenandoah
Porównuj charakterystykę pauz GC i kompromisy dotyczące przepustowości między nowoczesnymi kolektorami JVM.
Algorytmy GC: Serial, G1, ZGC, Shenandoah to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Wybór algorytmu GC
JVM udostępnia wiele algorytmów GC, z których każdy jest zoptymalizowany pod kątem innych obciążeń. Wybór właściwego zależy od rozmiaru sterty, wymagań dotyczących opóźnień i celów związanych z przepustowością.
// Enable GC algorithms:
// -XX:+UseSerialGC
// -XX:+UseParallelGC
// -XX:+UseG1GC (default since Java 9)
// -XX:+UseZGC (Java 15+ production)
// -XX:+UseShenandoahGC (Red Hat / OpenJDK builds)Serial GC
Serial GC używa pojedynczego wątku do zbierania. Wszystkie wątki aplikacji są zatrzymywane podczas GC („stop-the-world”). Ten algorytm nadaje się wyłącznie do małych stert lub środowisk z jednym procesorem, takich jak systemy wbudowane.
// Use:
// java -XX:+UseSerialGC -Xmx256m MyApp
// Pauses: long (proportional to heap size)
// Throughput: low
// Best for: CLI tools, small heaps < 100 MBParallel GC (kolektor przepustowości)
Parallel GC używa wielu wątków podczas Minor GC i Major GC. Pauzy „stop-the-world” są krótsze niż w Serial GC, ale nadal znaczące. Ten algorytm najlepiej sprawdza się w przetwarzaniu wsadowym, gdy przepustowość jest ważniejsza niż opóźnienia.
// Use:
// java -XX:+UseParallelGC -XX:ParallelGCThreads=8 MyApp
// Pauses: moderate
// Throughput: high
// Best for: batch jobs, number crunchingG1 GC (Garbage-First)
G1 dzieli stertę na regiony o jednakowym rozmiarze (~2 KB – 32 MB). Najpierw zbiera regiony zawierające najwięcej śmieci, realizując konfigurowalny docelowy czas pauzy. Jest domyślnym algorytmem od Java 9.
// Use:
// java -XX:+UseG1GC -XX:MaxGCPauseMillis=200 MyApp
// Pauses: bounded by target (but not guaranteed)
// Throughput: good
// Best for: large heaps (4 GB+), mixed workloadsTypy regionów G1
Regiony G1 są dynamicznie przypisywane jako Eden, Survivor, Old lub Humongous (dla dużych obiektów zajmujących ponad 50% rozmiaru regionu). Ta elastyczność umożliwia przyrostowe zbieranie.
ZGC (Z Garbage Collector)
ZGC wykonuje większość pracy współbieżnie z aplikacją. Czasy pauz zwykle wynoszą poniżej 1 ms, niezależnie od rozmiaru sterty. Jest gotowy do użycia w środowisku produkcyjnym od Java 15.
// Use:
// java -XX:+UseZGC -Xmx16g MyApp
// Pauses: < 1 ms (usually)
// Throughput: slightly lower than G1 (concurrent work has CPU cost)
// Best for: large heaps, low-latency services (APIs, trading)Shenandoah GC
Shenandoah (Red Hat) również osiąga pauzy poniżej milisekundy dzięki współbieżnej kompaktacji. Jest dostępny w kompilacjach OpenJDK. Ma cele bardzo podobne do ZGC, ale korzysta z innych algorytmów wewnętrznych.
// Use:
// java -XX:+UseShenandoahGC MyApp
// Available in: Red Hat builds, some AdoptOpenJDK distributions
// Pauses: sub-millisecond
// Best for: latency-sensitive workloadsGenerational ZGC (Java 21+)
W Javie 21 wprowadzono Generational ZGC, łącząc podejście ZGC z minimalnymi pauzami ze zbieraniem generacyjnym. Zmniejsza to narzut procesora przy zachowaniu minimalnych pauz.
// Enable in Java 21+:
// java -XX:+UseZGC -XX:+ZGenerational -Xmx8g MyAppKompromis między czasem pauz GC a przepustowością
Żaden algorytm GC nie jest najlepszy pod każdym względem. Parallel GC maksymalizuje przepustowość. G1 równoważy przepustowość i opóźnienia. ZGC i Shenandoah minimalizują pauzy kosztem niewielkiego spadku przepustowości.
Włączanie rejestrowania GC
Zdarzenia GC można rejestrować za pomocą -Xlog:gc*:file=gc.log:time,uptime,level. Należy analizować dzienniki za pomocą narzędzi takich jak GCViewer lub GCEasy, aby wykrywać długie pauzy i skoki alokacji.
// JVM flags:
// -Xlog:gc*:file=gc.log:time,uptime,level,tags
// Inspect logs:
// cat gc.log | grep "Pause"Monitorowanie GC za pomocą metryk JVM
Za pomocą ManagementFactory.getGarbageCollectorMXBeans() można programowo odczytywać liczbę i czas trwania cykli GC albo eksportować te dane do Prometheus za pośrednictwem Micrometer w aplikacjach Spring Boot.
ManagementFactory.getGarbageCollectorMXBeans().forEach(gc ->
System.out.printf("%s: %d collections, %d ms%n",
gc.getName(), gc.getCollectionCount(), gc.getCollectionTime()));Szybkie sprawdzenie
Który algorytm GC zapewnia produkcyjne czasy pauz poniżej milisekundy?
Podsumowanie
Serial GC jest przeznaczony do bardzo małych stert, Parallel GC do przepustowości zadań wsadowych, G1 do zrównoważonych obciążeń (domyślnie), a ZGC i Shenandoah do ekstremalnie małych opóźnień. Należy włączyć rejestrowanie GC w produkcji, aby wcześnie wykrywać problemy.
Ucz się Java dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 104
- Lekcje
- 374
Często zadawane pytania
Czy lekcja „Algorytmy GC: Serial, G1, ZGC, Shenandoah” jest bezpłatna?
Tak — pełny tekst „Algorytmy GC: Serial, G1, ZGC, Shenandoah” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Algorytmy GC: Serial, G1, ZGC, Shenandoah”?
Porównuj charakterystykę pauz GC i kompromisy dotyczące przepustowości między nowoczesnymi kolektorami JVM. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Algorytmy GC: Serial, G1, ZGC, Shenandoah”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Obszary sterty JVM i cykl życia obiektów
- Algorytmy GC: Serial, G1, ZGC, Shenandoah
- Wykrywanie i naprawianie wycieków pamięci
- Flagi dostrajania GC i profilowanie w JVisualVM