Middle+
Реци о собирачу смећа (garbage collector) у језику Go.
sobes.tech АИ
Одговор од АИ
Go koristi paralelni, trobojni, nekompaktni sakupljač smeća sa niskim kašnjenjima.
Osnovni principi rada:
- Označavanje (Mark): Određuje koje objekte su dostupne iz korenskih pokazivača (registara, stekova gorutina, globalnih promenljivih). Koristi algoritam sa tri boje (bela - ne posećena, siva - posećena, ali potomci još nisu provereni, crna - posećena i svi potomci provereni).
- Čišćenje (Sweep): Uklanja nedostupne objekte (ostaju beli) i oslobađa memoriju za ponovnu upotrebu.
Karakteristike:
- Paralelno: Označavanje se dešava paralelno sa izvršavanjem korisničkog koda (faze STW - Stop-The-World - su veoma kratke).
- Niska kašnjenja: Dizajnirano za minimiziranje pauza u radu aplikacije.
- Nekompaktno: Ne pomera žive objekte u memoriji, što može dovesti do fragmentacije, ali pojednostavljuje implementaciju i ubrzava označavanje/čišćenje.
Faze rada:
- Pomoć pri označavanju: Korisničke gorutine pomažu sakupljaču u fazi označavanja tokom alokacije memorije.
- Označavanje: Paralelno označavanje dostupnih objekata.
- Završetak označavanja: Kratka STW faza za finalizaciju označavanja.
- Čišćenje: Paralelno uklanjanje nedostupnih objekata.
Upravljanje:
- Automatski.
- Pragovi za pokretanje GC regulišu se promenljivom okruženja
GOGC. Podrazumevano,GOGC=100, što znači da će se sakupljanje započeti kada se veličina hrpe udvostruči u odnosu na prethodni ciklus. - Funkcija
runtime.GC()pokreće forsirano sakupljanje smeća, ali se njenim korišćenjem ne preporučuje u standardnom kodu.
package main
import (
"runtime"
"time"
)
func main() {
// Primer forsiranog poziva GC (retko je potrebno)
runtime.GC()
// Primer dobijanja statistike GC
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Ukupno alocirana memorija: %v bajta\n", memStats.TotalAlloc)
}
Prednosti:
- Automatsko upravljanje memorijom, smanjuje verovatnoću grešaka (curenje memorije, dvostruko oslobađanje).
- Dizajniran za konkurentno izvršavanje.
Nedostaci:
- Nondeterminističko vreme rada GC.
- Moguće povećanje potrošnje memorije u poređenju sa ručnim upravljanjem.