0Pricing
Go Academy · Lektion

Interna des Garbage Collectors

Dreifarbige Mark-and-Sweep-Strategie, GOGC und GC-Pausen

Interna des Garbage Collectors ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.

Dreifarbiger Mark-and-Sweep-Algorithmus

Der GC von Go verwendet einen nebenläufigen dreifarbigen Mark-and-Sweep-Algorithmus. Objekte sind weiß (nicht besucht), grau (gefunden, aber untergeordnete Objekte noch nicht gescannt) oder schwarz (vollständig gescannt). Weiße Objekte sind beim Sweep Garbage.

Nebenläufiger GC

Der Go-GC läuft größtenteils nebenläufig mit den Anwendungs-Goroutines. Dadurch werden Stop-the-world-(STW)-Pausen in den meisten Programmen auf eine Dauer von unter einer Millisekunde reduziert.

Write-Barrier

Eine Write-Barrier fängt Zeigerschreibvorgänge während der nebenläufigen Markierungsphase ab, um die Invariante aufrechtzuerhalten, dass schwarze Objekte nicht auf weiße Objekte verweisen. Sie verursacht bei jedem Zeigerschreibvorgang einen geringen Overhead.

STW-Phasen

Pro GC-Zyklus gibt es zwei kurze STW-Pausen: (1) Markierungsvorbereitung (Write-Barrier aktivieren, Goroutine-Stacks als Snapshot erfassen), (2) Markierungsende (sicherstellen, dass alle grauen Objekte gescannt wurden). P99 liegt typischerweise bei <1ms.

GOGC

Der GC-Trigger wird durch GOGC gesteuert (Standardwert 100). Das bedeutet: „GC ausführen, wenn sich die Größe des Live-Heaps seit der vorherigen GC verdoppelt hat.“ GOGC=50 löst häufiger einen GC mit geringerem Speicherverbrauch aus; GOGC=200 seltener einen GC mit höherem Speicherverbrauch.

GOMEMLIMIT

GOMEMLIMIT (Go 1.19+) legt ein weiches Speicherlimit fest. Nähert sich der Heap diesem Limit, führt die GC unabhängig von GOGC aggressiver aus. Verwenden Sie es, um OOM-Kills in Umgebungen mit begrenztem Speicher zu verhindern.

import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)

Taktung

Die GC steuert ihr Arbeitstempo so, dass sie das Markieren abschließt, bevor sich der Heap im Verhältnis zu GOGC füllt. Bei hoher Allokationsrate erhöht sie die Anzahl der Goroutinen, die beim Markieren mithelfen (Mark Assists).

runtime.GC()

Der Aufruf runtime.GC() erzwingt einen sofortigen GC-Zyklus. Das ist in Tests nützlich, um sicherzustellen, dass Finalizer ausgeführt werden, oder in Benchmarks, um mit einem leeren Heap zu starten. Rufen Sie ihn nicht in Produktivcode auf.

Finalizer

Registrieren Sie mit runtime.SetFinalizer eine Funktion, die ausgeführt wird, wenn ein Objekt vom Garbage Collector eingesammelt wird. Finalizer werden nach der GC in einer dedizierten Goroutine ausgeführt. Vermeiden Sie sie zur Ressourcenbereinigung – verwenden Sie stattdessen Close()-Methoden.

GC-Metriken

Lesen Sie GC-Statistiken mit runtime.ReadMemStats aus oder stellen Sie sie über Prometheus-Metriken bereit. Wichtige Felder: 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

Ein Hintergrund-Scavenger gibt inaktiven Heap-Speicher an das Betriebssystem zurück. Er läuft nebenläufig und wird so getaktet, dass die Leistung von Vordergrundprozessen nicht beeinträchtigt wird. Dazu wird der Systemaufruf MADV_FREE oder MADV_DONTNEED verwendet.

Schnelltest

Was bewirkt GOMEMLIMIT in Go 1.19+?

Zusammenfassung: GC-Interna

Wichtige Punkte:

  • Konkurrierendes Tricolor-Mark-and-Sweep mit zwei kurzen STW-Pausen
  • GOGC steuert das Verhältnis des Heap-Wachstums; Standardwert 100 (100 % Wachstum löst die GC aus)
  • GOMEMLIMIT für Speichersicherheit in Containern (Go 1.19+)
  • runtime.ReadMemStats für GC-Metriken

Häufig gestellte Fragen

Ist die Lektion „Interna des Garbage Collectors“ kostenlos?

Ja — der vollständige Text von „Interna des Garbage Collectors“ 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 „Interna des Garbage Collectors“?

Dreifarbige Mark-and-Sweep-Strategie, GOGC und GC-Pausen 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 3 von 4.

Wie lange dauert die Lektion „Interna des Garbage Collectors“?

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