Sobes.tech
Middle

Jaké jsou vaše znalosti o sběrači odpadků v jazyce Go?

sobes.tech AI

Odpověď od AI

Golang používá paralelní a nízkozpožděný garbage collector založený na algoritmu mark-sweep.

Hlavní vlastnosti:

  1. Tříbarevný algoritmus (Three-color algorithm): Označuje objekty třemi barvami: bílou (potenciální odpad), šedou (objekt je dosažitelný, ale jeho potomci nejsou prozkoumáni) a černou (objekt a jeho potomci jsou dosažitelní).
  2. Paralelní zpracování (Parallel): Funguje paralelně s uživatelskými gorutinami na více jádrech, minimalizuje dobu zastavení.
  3. Konkurentní zpracování (Concurrent): Většina práce GC je prováděna současně s během programu.
  4. Minimalizace doby zastavení (Low-latency Stop-The-World): Čas zastavení všech gorutin (STW) je extrémně krátký, používá se pouze pro fáze "začátek označování" (start of marking) a "ukončení označování" (end of marking), aby byla zajištěna konzistence grafu objektů.
  5. Opakovaně použitelné skeny (Stack scanning): Skenování zásobníků je také prováděno paralelně a konkurentně s STW.
  6. Cílová úroveň naplnění haldy (Heap growth target): GC se snaží udržovat určité procento naplnění haldy po každém cyklu, aby se zabránilo příliš častým nebo příliš vzácným cyklům. Tento práh lze řídit proměnnou GOGC. Výchozí hodnota je GOGC=100, což znamená, že GC se spustí, když se velikost haldy zdvojnásobí.

Cyklus práce GC se skládá z následujících fází:

  1. GCstart: Krátká fáze STW. Určuje kořenové objekty pro označování.
  2. GCmark: Konkurentní fáze. GC prochází graf objektů a označuje dosažitelné objekty (šedá -> černá). Používá write barrier k sledování změn v grafu během označování.
  3. GCmarktermination: Krátká fáze STW. Dokončuje označování a přepíná z write barrier na sweep.
  4. GCsweep: Konkurentní fáze. Nedosažitelné (bílé) objekty jsou uvolněny. Tato fáze může probíhat na pozadí nebo podle potřeby při alokaci nové paměti.

GC v Go je řízen automaticky a není třeba jej ručně volat ve většině případů. Výkon GC lze sledovat pomocí proměnných prostředí GODEBUG=gctrace=1.

Příklad sledování:

$ GODEBUG=gctrace=1 go run your_program.go

Výstup gctrace ukazuje informace o každém cyklu GC, včetně časů fází, velikosti haldy a času STW.

Pro optimalizaci GC, kromě nastavení GOGC, lze zvážit:

  • Snížení počtu alokací (například opětovným použitím bufferů, vyhýbáním se zbytečným konverzím).
  • Profilování na základě "escape analysis" pro pochopení, které objekty jsou alokovány na haldě.
  • Použití poolů (sync.Pool) pro často vytvářené a uvolňované objekty.