Sobes.tech
Middle+

Porozprávaj o zberači odpadkov (garbage collector) v jazyku Go.

sobes.tech AI

Odpoveď od AI

Go používa paralelného, trojfarebného, nekompaktného zberača odpadu s nízkymi latenciami.

Hlavné princípy práce:

  • Označovanie (Mark): Určuje, ktoré objekty sú dostupné z koreňových ukazovateľov (registre, zásobníky gorútin, globálne premenné). Používa trojfarebný algoritmus (biely - neprebádaný, sivý - prebádaný, ale potomky ešte nie sú overené, čierny - prebádaný a všetky potomky overené).
  • Zber (Sweep): Odstraňuje nedostupné objekty (ostávajú biele) a uvoľňuje pamäť na opätovné použitie.

Špecifiká:

  • Paralelný: Označovanie prebieha paralelne s vykonaním používateľského kódu (STW - Stop-The-World fázy sú veľmi krátke).
  • Nízke latencie: Navrhnuté na minimalizáciu prestojov v práci aplikácie.
  • Nekompaktný: Nepresúva živé objekty v pamäti, čo môže viesť k fragmentácii, ale zjednodušuje implementáciu a zrýchľuje označovanie/zber.

Fázy práce:

  1. Pomoc pri označovaní: Používateľské gorutiny pomáhajú zberaču v fáze označovania pri alokácii pamäti.
  2. Označovanie: Paralelné označovanie dostupných objektov.
  3. Ukončenie označovania: Krátka STW fáza na finalizáciu označovania.
  4. Zber: Paralelné odstránenie nedostupných objektov.

Riadenie:

  • Automatické.
  • Práhly zberu odpadu (GC trigger) sa nastavujú pomocou prostredia premennej GOGC. Predvolene GOGC=100, čo znamená, že zber sa spustí, keď veľkosť haldy zdvojnásobí v porovnaní s predchádzajúcim cyklom.
  • Funkcia runtime.GC() nútene spúšťa zber odpadu, ale jej použitie sa neodporúča v štandardnom kóde.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Príklad núteného volania GC (zriedka potrebné)
	runtime.GC()

	// Príklad získania štatistiky GC
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Celková alokovaná pamäť: %v bajtov\n", memStats.TotalAlloc)
}

Výhody:

  • Automatické riadenie pamäti, znižuje pravdepodobnosť chýb (úniky pamäti, dvojité uvoľnenia).
  • Navrhnuté na konkurenčné vykonávanie.

Nevýhody:

  • Netransparentný čas práce GC.
  • Možné zvýšenie spotreby pamäti v porovnaní s ručným riadením.