Speicher Bereinigung
Automatische Freigabe von Heap-Speicher durch die Laufzeitumgebung.
Klassifikation
- KomplexitätMittel
- AuswirkungTechnisch
- EntscheidungstypArchitektur
- OrganisationsreifeReif
Technischer Kontext
Prinzipien & Ziele
Use Cases & Szenarien
Kompromisse
- Zu kleine Heaps führen zu häufigen Collections
- Pausen-Spitzen beeinträchtigen SLAs
- Falsch konfigurierte Logs erzeugen Overhead
- Heap-Größen explizit festlegen statt Default nutzen
- GC-Logs im JSON-Format für Analyse aktivieren
- Object-Allocation-Rate überwachen und reduzieren
I/O & Ressourcen
- Heap-Größenvorgaben (Initial- und Maximalgröße)
- Collector- und Tuning-Parameter je nach Laufzeit
- Monitoring- und Profiling-Tools
- Freigegebener Heap-Speicher
- Stabile Latenzprofile
- GC-Telemetrie für Kapazitätsplanung
Beschreibung
Garbage Collection (GC) bezeichnet Strategien, mit denen verwaltete Laufzeitumgebungen unzugängliche Objekte automatisch erkennen und deren Speicher freigeben. Typische Ansätze sind Tracing-Collector (Mark-Sweep, Generational, Incremental, Concurrent) oder Referenzzählung mit Zyklen-Erkennung. Ziel ist es, Speicherlecks zu verhindern, manuelle Deallokation überflüssig zu machen und Latenz- sowie Durchsatzanforderungen unterschiedlicher Workloads auszubalancieren.
✔Vorteile
- Reduziert Speicherlecks und Double-Free-Fehler
- Entwickler müssen nicht explizit deallozieren
- Stabile Performance trotz Objektfluktuation
✖Limitationen
- Stop-the-world-Pausen können Latenz erhöhen
- Nicht-deterministische Freigabezeiten
- Tuning-Aufwand je nach Workload
Trade-offs
Metriken
- Maximale GC-Pause
Längste Stop-the-world-Dauer pro Sammlung.
- Durchsatz (Ops/s)
Verarbeitete Operationen pro Sekunde unter stabiler GC-Last.
- Heap-Nutzungsgrad
Anteil des genutzten Heaps vor und nach Collections.
Beispiele & Implementierungen
Generational GC in einem Webservice
Standard-Collector mit kurzen Pausen für API-Workloads.
Nebenläufiger Collector für speicherintensive Analytics
Sehr große Heaps mit Pausen im niedrigen Millisekundenbereich.
Durchsatzorientierter Collector in Batch-Pipelines
Maximaler Durchsatz wichtiger als Latenz.
Implementierungsschritte
Workload analysieren (Latenz vs. Durchsatz)
Passenden Collector wählen (z.B. generational, concurrent, reference counting)
GC-Flags setzen, Metriken instrumentieren, Lasttest fahren
⚠️ Technische Schulden & Engpässe
Tech Debt
- Veraltete Laufzeitversion ohne moderne Collector-Optionen
- Keine automatisierte GC-Log-Auswertung
- Fehlende Loadtests für GC-Regressionen
Bekannte Engpässe
Beispiele für Missbrauch
- Regionenbasierter Collector mit sehr kleinem Heap in Latenz-kritischen Diensten
- Reiner Durchsatz-Collector für UI-Anwendungen
- Aggressive Finalizer statt klarer Lebenszyklusregeln
Typische Fallen
- Pausen-Spitzen durch Full-GC nach Allocation-Bursts
- Versehentliche Promotion langer Objektketten
- Unterschätzte Fragmentierung bei nicht-kopierenden Collectors
Erforderliche Fähigkeiten
Drivers (Architectural Drivers)
Constraints
- • Maximale Pausenzeit laut SLA
- • Begrenzte CPU-Kerne für GC-Threads
- • Kompatible Laufzeitversion