Stos a sterta i analiza ucieczki
Jak Go decyduje, gdzie alokować pamięć
Stos a sterta i analiza ucieczki to bezpłatna lekcja Go Academy na CoddyKit. To lekcja 1 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.
Alokacja na stosie
Zmienne lokalne, które nie opuszczają funkcji, są alokowane na stosie goroutine. Alokacja na stosie jest szybka (wymaga tylko zwiększenia wskaźnika) i nie generuje kosztu zbierania (ramka stosu jest usuwana przy powrocie z funkcji).
Alokacja na stercie
Zmienne, które trafiają na stertę, są alokowane za pomocą alokatora Go i śledzone przez garbage collector. Alokacja na stercie jest wolniejsza i zwiększa obciążenie GC.
Co powoduje ucieczkę?
Typowe przyczyny ucieczki: pobranie adresu zmiennej lokalnej i zwrócenie go, zapisanie zmiennej lokalnej w interfejsie albo wysłanie jej przez kanał. Określa to analiza ucieczki przeprowadzana przez kompilator.
func newUser() *User { // *User escapes to heap
return &User{Name: "Alice"}
}go build -gcflags=-m
Wyświetl decyzje analizy ucieczki:
go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escapeStosy goroutine
Każda goroutine rozpoczyna działanie z małym stosem (2 KiB w Go 1.14+), który w razie potrzeby dynamicznie się powiększa. Stosy są oddzielone od sterty i są odzyskiwane po zakończeniu działania goroutine.
Unikanie alokacji
Przekazuj wartości (nie wskaźniki) w przypadku małych struktur. Używaj alokowanych na stosie tablic zamiast slice'ów, gdy ich rozmiar jest znany. Zwracaj wartości zamiast wskaźników, aby pozostawić je na stosie.
Boksowanie interfejsów
Przypisanie konkretnej wartości do interfejsu powoduje ucieczkę tej wartości na stertę (boksowanie). W często wykonywanych ścieżkach przyjmuj typy konkretne albo używaj generyków zamiast interfejsów.
sync.Pool
Używaj sync.Pool do ponownego wykorzystywania obiektów alokowanych na stercie, aby zmniejszyć obciążenie GC powodowane częstym alokowaniem krótkotrwałych obiektów (buforów, kontekstów żądań).
var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])Profilowanie alokacji
Używaj go test -benchmem oraz profilowania sterty z opcją -alloc_space, aby znaleźć funkcje alokujące najwięcej pamięci.
Slice a tablica
Mała tablica [N]T może pozostać na stosie. Nagłówek slice'a (24 bajty) jest alokowany na stosie, ale jego tablica bazowa może uciec na stertę. Wstępna alokacja za pomocą make pozwala uniknąć wielokrotnego zmieniania rozmiaru.
Internowanie ciągów znaków
Literały łańcuchów znaków nie są alokowane na stercie (znajdują się w segmencie danych tylko do odczytu). Konwersja []byte na string powoduje alokację. Buforuj często używane ciągi znaków, aby uniknąć wielokrotnych konwersji.
Szybkie sprawdzenie
Co powoduje ucieczkę zmiennej lokalnej ze stosu na stertę?
Podsumowanie: stos a sterta
Najważniejsze informacje:
- Stos: szybkość i brak kosztu GC; sterta: mniejsza szybkość i śledzenie przez GC
- go build -gcflags="-m" pokazuje decyzje dotyczące ucieczki
- Boksowanie interfejsów, pobranie adresu zmiennej lokalnej i wysyłanie przez kanał powodują ucieczkę
- sync.Pool służy do często alokowanych i odrzucanych obiektów
Często zadawane pytania
Czy lekcja „Stos a sterta i analiza ucieczki” jest bezpłatna?
Tak — pełny tekst „Stos a sterta i analiza ucieczki” 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 „Stos a sterta i analiza ucieczki”?
Jak Go decyduje, gdzie alokować pamięć Ć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 1 z 4.
Ile czasu zajmuje lekcja „Stos a sterta i analiza ucieczki”?
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