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:
- Pomoc pri označovaní: Používateľské gorutiny pomáhajú zberaču v fáze označovania pri alokácii pamäti.
- Označovanie: Paralelné označovanie dostupných objektov.
- Ukončenie označovania: Krátka STW fáza na finalizáciu označovania.
- Zber: Paralelné odstránenie nedostupných objektov.
Riadenie:
- Automatické.
- Práhly zberu odpadu (GC trigger) sa nastavujú pomocou prostredia premennej
GOGC. PredvoleneGOGC=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.