0Pricing
Go Academy · Lekcja

Wewnętrzne działanie garbage collectora

Trójkolorowe oznaczanie i zamiatanie, GOGC oraz pauzy GC

Wewnętrzne działanie garbage collectora to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 3 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 Go Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Go Academy zawiera 4 lekcji w sumie.

Trójkolorowe oznaczanie i zamiatanie

GC w Go używa współbieżnego algorytmu trójkolorowego oznaczania i zamiatania. Obiekty są białe (nieodwiedzone), szare (znalezione, ale z niezeskanowanymi elementami potomnymi) albo czarne (w pełni zeskanowane). Białe obiekty są uznawane za śmieci podczas zamiatania.

Współbieżny GC

GC w Go działa w większości współbieżnie z goroutine aplikacji. Zmniejsza to przerwy stop-the-world (STW) do czasu poniżej milisekundy w większości programów.

Bariera zapisu

Bariera zapisu przechwytuje zapisy wskaźników podczas współbieżnej fazy oznaczania, aby zachować niezmiennik, zgodnie z którym czarne obiekty nie wskazują białych obiektów. Dodaje to niewielki narzut do każdego zapisu wskaźnika.

Fazy STW

Dwie krótkie przerwy STW w każdym cyklu GC: (1) przygotowanie oznaczania (włączenie bariery zapisu, wykonanie migawki stosów goroutine), (2) zakończenie oznaczania (zapewnienie zeskanowania wszystkich szarych obiektów). P99 zazwyczaj wynosi <1ms.

GOGC

Wyzwalanie GC jest kontrolowane przez GOGC (domyślnie 100). Oznacza to „uruchom GC, gdy rozmiar zajętej sterty podwoi się w porównaniu z poprzednim GC”. Ustawienie GOGC=50 powoduje częstsze uruchamianie GC i mniejsze zużycie pamięci; GOGC=200 — rzadsze uruchamianie GC i większe zużycie pamięci.

GOMEMLIMIT

GOMEMLIMIT (Go 1.19+) ustawia miękki limit pamięci. Gdy sterta zbliża się do limitu, GC działa intensywniej niezależnie od wartości GOGC. Należy używać go, aby zapobiegać zabijaniu procesu przez OOM w środowiskach z ograniczoną pamięcią.

import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)

Sterowanie tempem pracy

GC dobiera tempo pracy tak, aby zakończyć znakowanie, zanim sterta zapełni się w stopniu wynikającym z GOGC. Przy wysokim tempie alokacji zwiększa liczbę goroutines pomagających w znakowaniu (mark assists).

runtime.GC()

Wywołanie runtime.GC() wymusza natychmiastowy cykl GC. Jest przydatne w testach, aby upewnić się, że finalizatory zostaną uruchomione, lub w benchmarkach, aby rozpocząć pracę z pustą stertą. Nie należy wywoływać go na produkcji.

Finalizatory

Za pomocą runtime.SetFinalizer można zarejestrować funkcję uruchamianą, gdy obiekt zostanie zebrany przez GC. Finalizatory są uruchamiane w osobnej goroutine po zakończeniu GC. Nie należy używać ich do zwalniania zasobów — zamiast tego należy stosować metody Close().

Metryki GC

Statystyki GC można odczytywać za pomocą runtime.ReadMemStats lub udostępniać je jako metryki Prometheus. Najważniejsze pola to: NumGC, PauseNs, HeapAlloc, HeapInuse.

var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])

Scavenger

Działający w tle scavenger zwraca bezczynną pamięć sterty do systemu operacyjnego. Działa współbieżnie i dobiera tempo pracy tak, aby nie wpływać na wydajność zadań pierwszoplanowych. Wykorzystuje wywołanie systemowe MADV_FREE lub MADV_DONTNEED.

Szybkie sprawdzenie

Co robi GOMEMLIMIT w Go 1.19+?

Podsumowanie: wewnętrzne działanie GC

Najważniejsze informacje:

  • Współbieżne znakowanie i zamiatanie w trzech kolorach; dwie krótkie pauzy STW
  • GOGC steruje współczynnikiem wzrostu sterty; wartość domyślna to 100 (wzrost o 100% uruchamia GC)
  • GOMEMLIMIT zapewnia bezpieczeństwo pamięci kontenerów (Go 1.19+)
  • runtime.ReadMemStats służy do odczytu metryk GC

Często zadawane pytania

Czy lekcja „Wewnętrzne działanie garbage collectora” jest bezpłatna?

Tak — pełny tekst „Wewnętrzne działanie garbage collectora” 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 Go Academy, przejdź na CoddyKit PRO. Kurs Go Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Wewnętrzne działanie garbage collectora”?

Trójkolorowe oznaczanie i zamiatanie, GOGC oraz pauzy GC Ćwiczysz Go 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ąć Go Academy?

Nie wymagamy żadnego doświadczenia. Go 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 3 z 4.

Ile czasu zajmuje lekcja „Wewnętrzne działanie garbage collectora”?

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 Go Academy?

Tak. Każda lekcja Go 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. Stos a sterta i analiza ucieczki
  2. Model pamięci Go i relacja happens-before
  3. Wewnętrzne działanie garbage collectora
  4. Ograniczanie alokacji: sync.Pool i areny
← Powrót do Go Academy