0Pricing
Go Academy · Lekcja

Profilowanie sterty i alokacji

Wykrywanie miejsc intensywnego użycia pamięci za pomocą profili sterty

Profilowanie sterty i alokacji 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.

Dlaczego profilowanie sterty?

Nadmierna liczba alokacji pamięci spowalnia programy w Go z powodu obciążenia mechanizmu GC. Profilowanie sterty pokazuje, które ścieżki kodu alokują najwięcej pamięci, dzięki czemu można ograniczyć liczbę alokacji.

Przechwytywanie profilu sterty

Za pośrednictwem punktu końcowego HTTP (wymaga net/http/pprof):

go tool pprof http://localhost:6060/debug/pprof/heap

Profil sterty oparty na pliku

Proszę zapisać profil sterty w dowolnym momencie za pomocą runtime/pprof:

f, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(f)
f.Close()

inuse a alloc

Profil sterty ma dwa widoki: inuse_objects/inuse_space (obiekty aktualnie aktywne) oraz alloc_objects/alloc_space (łączna liczba od uruchomienia). Proszę użyć alloc_space, aby znaleźć intensywne ścieżki alokacji.

go tool pprof -alloc_space http://localhost:6060/debug/pprof/heap

go test -memprofile

Proszę przechwycić profil pamięci podczas benchmarków:

go test -memprofile mem.prof -benchmem -bench=BenchmarkProcess ./...

MemStats

Proszę programowo odczytywać statystyki pamięci środowiska uruchomieniowego w celu monitorowania na żywo:

var ms runtime.MemStats
runtime.ReadMemStats(&ms)
fmt.Printf("Alloc: %v MiB\n", ms.Alloc/1024/1024)
fmt.Printf("NumGC: %v\n", ms.NumGC)

Analiza ucieczki

Zmienne, które uciekają na stertę, powodują alokacje. Proszę uruchomić go build -gcflags=-m, aby zobaczyć, które zmienne uciekają i dlaczego.

go build -gcflags="-m -m" ./...
// main.go:12:15: &User{...} escapes to heap

Ograniczanie alokacji: wstępna alokacja

Proszę wstępnie alokować wycinki za pomocą make([]T, 0, n), gdy znana jest ich końcowa długość. Pozwala to uniknąć wielokrotnej realokacji podczas zwiększania rozmiaru wycinka.

results := make([]Result, 0, len(input))

sync.Pool do ponownego użycia

Proszę przechowywać obiekty wielokrotnego użytku (bufory, wycinki robocze) w sync.Pool, aby rozłożyć koszt alokacji:

var pool = sync.Pool{
    New: func() any { return new(bytes.Buffer) },
}
buf := pool.Get().(*bytes.Buffer)
buf.Reset()
// use buf...
pool.Put(buf)

Odbiorniki wartościowe a wskaźnikowe

Duże struktury przekazywane przez wartość są kopiowane przy każdym wywołaniu. Proszę przekazywać je przez wskaźnik, aby uniknąć kopiowania, ale należy pamiętać, że wskaźniki mogą spowodować ucieczkę wartości na stertę.

String a []byte

Konwersja między string a []byte powoduje alokację. Proszę używać []byte w całych intensywnie wykonywanych ścieżkach kodu i konwertować do string tylko na granicy, gdzie wymagany jest string.

Szybkie sprawdzenie

Co pokazuje -alloc_space w profilu sterty pprof?

Podsumowanie: profilowanie sterty

Najważniejsze informacje:

  • -alloc_space pokazuje łączną liczbę alokacji, a inuse_space pokazuje obiekty aktywne
  • go build -gcflags=-m pokazuje wyniki analizy ucieczki
  • Proszę wstępnie alokować wycinki i używać sync.Pool do częstego ponownego wykorzystania
  • runtime.ReadMemStats służy do programowego monitorowania

Często zadawane pytania

Czy lekcja „Profilowanie sterty i alokacji” jest bezpłatna?

Tak — pełny tekst „Profilowanie sterty i alokacji” 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 „Profilowanie sterty i alokacji”?

Wykrywanie miejsc intensywnego użycia pamięci za pomocą profili sterty Ć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 „Profilowanie sterty i alokacji”?

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. Pisanie benchmarków za pomocą testing.B
  2. Profilowanie procesora za pomocą pprof
  3. Profilowanie sterty i alokacji
  4. Śledzenie wykonania
← Powrót do Go Academy