Middle+
Pověz o sběrači odpadků (garbage collector) v jazyce Go.
sobes.tech AI
Odpověď od AI
Go používá paralelní, tříbarevný, nekompaktní sběrač odpadků s nízkou latencí.
Hlavní principy fungování:
- Značení (Mark): Určuje, které objekty jsou dosažitelné z kořenových ukazatelů (registry, zásobníky gorutin, globální proměnné). Používá algoritmus tří barev (bílá - nenavštívená, šedá - navštívená, ale potomci ještě neověřeni, černá - navštívená a všichni potomci ověřeni).
- Úklid (Sweep): Odstraňuje nedosažitelné objekty (zůstávají bílé) a uvolňuje paměť pro opětovné použití.
Vlastnosti:
- Paralelní: Značení probíhá paralelně s vykonáváním uživatelského kódu (fáze STW - Stop-The-World - jsou velmi krátké).
- Nízké latence: Navrženo tak, aby minimalizovalo pauzy v běhu aplikace.
- Nekompaktní: Nepřesouvá živé objekty v paměti, což může vést k fragmentaci, ale zjednodušuje implementaci a urychluje značení/úklid.
Fáze práce:
- Pomoc při značení: Uživatelské gorutiny pomáhají sběrači při fázi značení při alokaci paměti.
- Značení: Paralelní značení dosažitelných objektů.
- Dokončení značení: Krátká fáze STW k finalizaci značení.
- Úklid: Paralelní odstranění nedosažitelných objektů.
Správa:
- Automatická.
- Prahy spouštění GC (garbage collection) jsou regulovány proměnnou prostředí
GOGC. Ve výchozím nastavení jeGOGC=100, což znamená, že sběr začne, když se velikost haldy zdvojnásobí ve srovnání s předchozím cyklem. - Funkce
runtime.GC()spouští nucenou sběr odpadků, ale její použití se nedoporučuje v standardním kódu.
package main
import (
"runtime"
"time"
)
func main() {
// Příklad nuceného volání GC (zřídka potřeba)
runtime.GC()
// Příklad získání statistik GC
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Celková alokovaná paměť: %v bajtů\n", memStats.TotalAlloc)
}
Výhody:
- Automatické řízení paměti, snižuje pravděpodobnost chyb (úniky paměti, dvojité uvolnění).
- Navrženo pro konkurenční provádění.
Nevýhody:
- Nedeterministická doba práce GC.
- Možné zvýšení spotřeby paměti ve srovnání s ruční správou.