Java Academy · Lekcja

Algorytmy GC: Serial, G1, ZGC, Shenandoah

Porównuj charakterystykę pauz GC i kompromisy dotyczące przepustowości między nowoczesnymi kolektorami JVM.

Lekcja 2 z 413 kroki

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 MB

Parallel 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 crunching

G1 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 workloads

Typy 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 workloads

Generational 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 MyApp

Kompromis 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.

Bezpłatny start

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

  1. Obszary sterty JVM i cykl życia obiektów
  2. Algorytmy GC: Serial, G1, ZGC, Shenandoah
  3. Wykrywanie i naprawianie wycieków pamięci
  4. Flagi dostrajania GC i profilowanie w JVisualVM
← Powrót do Java Academy