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
- Stos a sterta i analiza ucieczki
- Model pamięci Go i relacja happens-before
- Wewnętrzne działanie garbage collectora
- Ograniczanie alokacji: sync.Pool i areny