Sobes.tech
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:

  1. Pomoc při značení: Uživatelské gorutiny pomáhají sběrači při fázi značení při alokaci paměti.
  2. Značení: Paralelní značení dosažitelných objektů.
  3. Dokončení značení: Krátká fáze STW k finalizaci značení.
  4. Ú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í je GOGC=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.