0Pricing
Go Academy · Lektion

Stack und Heap sowie Escape-Analyse

Wie Go entscheidet, wo Speicher alloziert wird

Stack und Heap sowie Escape-Analyse ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Stack-Allokation

Lokale Variablen, die nicht aus der Funktion entweichen, werden auf dem Goroutine-Stack allokiert. Die Stack-Allokation ist schnell (nur ein Erhöhen eines Zeigers) und verursacht keine Kosten für die Speicherbereinigung (der Stack-Frame wird bei der Rückkehr entfernt).

Heap-Allokation

Variablen, die auf den Heap entweichen, werden mit dem Go-Allokator allokiert und vom Garbage Collector verfolgt. Heap-Allokation ist langsamer und erhöht den GC-Druck.

Was verursacht ein Escape?

Häufige Ursachen für ein Escape sind, die Adresse einer lokalen Variablen zu übernehmen und zurückzugeben, eine lokale Variable in einem Interface zu speichern oder sie über einen Channel zu senden. Die Escape-Analyse des Compilers entscheidet darüber.

func newUser() *User { // *User escapes to heap
    return &User{Name: "Alice"}
}

go build -gcflags=-m

Geben Sie die Entscheidungen der Escape-Analyse aus:

go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escape

Goroutine-Stacks

Jede Goroutine startet mit einem kleinen Stack (2 KiB in Go 1.14+), der bei Bedarf dynamisch wächst. Stacks sind vom Heap getrennt und werden beim Beenden der Goroutine freigegeben.

Allokationen vermeiden

Übergeben Sie kleine Structs als Werte (nicht als Pointer). Verwenden Sie bei bekannter Größe Stack-allokierte Arrays statt Slices. Geben Sie Werte statt Pointer zurück, damit sie auf dem Stack bleiben.

Interface-Boxing

Das Zuweisen eines konkreten Werts zu einem Interface lässt den Wert auf den Heap entweichen (Boxing). Verwenden Sie für Hot Paths konkrete Typen oder Generics statt Interfaces.

sync.Pool

Verwenden Sie sync.Pool, um Heap-allokierte Objekte wiederzuverwenden und so den GC-Druck durch häufige Allokationen kurzlebiger Objekte (Buffer, Request-Kontexte) zu reduzieren.

var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])

Allokationen profilieren

Verwenden Sie go test -benchmem und Heap-Profiling mit -alloc_space, um die Funktionen zu finden, die am meisten Speicher allokieren.

Slice vs. Array

Ein kleines Array [N]T kann auf dem Stack bleiben. Ein Slice-Header (24 Bytes) wird auf dem Stack allokiert, aber sein zugrunde liegendes Array kann entweichen. Vorab mit make zu allokieren, verhindert wiederholte Neuzuweisungen.

String-Interning

String-Literale werden nicht auf dem Heap allokiert (sie befinden sich im schreibgeschützten Datensegment). Die Konvertierung von []byte in einen String allokiert Speicher. Cachen Sie häufig verwendete Strings, um wiederholte Konvertierungen zu vermeiden.

Schnelltest

Was bewirkt, dass eine lokale Variable vom Stack auf den Heap entweicht?

Zusammenfassung: Stack vs. Heap

Wichtige Punkte:

  • Stack: schnell, keine GC-Kosten; Heap: langsamer, vom GC verfolgt
  • go build -gcflags="-m" zeigt Escape-Entscheidungen an
  • Interface-Boxing, die Übernahme der Adresse einer lokalen Variablen und das Senden über einen Channel verursachen Escapes
  • sync.Pool für häufig allokierte und verworfene Objekte

Häufig gestellte Fragen

Ist die Lektion „Stack und Heap sowie Escape-Analyse“ kostenlos?

Ja — der vollständige Text von „Stack und Heap sowie Escape-Analyse“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Stack und Heap sowie Escape-Analyse“?

Wie Go entscheidet, wo Speicher alloziert wird Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Go Academy zu starten?

Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Stack und Heap sowie Escape-Analyse“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?

Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Stack und Heap sowie Escape-Analyse
  2. Das Go-Speichermodell und Happens-Before
  3. Interna des Garbage Collectors
  4. Allokationen reduzieren: sync.Pool und Arenen
← Zurück zu Go Academy