0Pricing
Go Academy · Lekcja

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 escape

Stosy 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

  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