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

  1. Pomoć pri označavanju: Korisničke gorutine pomažu sakupljaču u fazi označavanja tokom alokacije memorije.
  2. Označavanje: Paralelno označavanje dostupnih objekata.
  3. Završetak označavanja: Kratka STW faza za finalizaciju označavanja.
  4. Č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.