Middle+
Pastāsti par atkritumu savācēju (garbage collector) Go valodā.
sobes.tech AI
Atbilde no AI
Go izmanto paralēlo, trīskrāsu, nekompaktējošu atkritumu savācēju ar zemu aizkavi.
Galvenie darba principi:
- Marķēšana (Mark): Nosaka, kuri objekti ir sasniedzami no sakņu norādītājiem (reģistri, gorutīnu stabi, globālās mainīgās). Tiek izmantots trīskrāsu algoritms (balts - neapmeklēts, pelēks - apmeklēts, bet vēl nav pārbaudīts, melns - apmeklēts un visi pēcnācēji pārbaudīti).
- Vākšana (Sweep): Noņem nepieejamos objektus (paliek balti) un atbrīvo atmiņu atkārtotai izmantošanai.
Īpatnības:
- Paralēla: Marķēšana notiek paralēli ar lietotāja koda izpildi (STW - Stop-The-World fāzes ir ļoti īsas).
- Zemas aizkaves: Izstrādāts, lai samazinātu pārtraukumus lietojumprogrammā.
- Nekompaktējošs: Nepārvieto dzīvos objektus atmiņā, kas var novest pie fragmentācijas, bet vienkāršo īstenošanu un paātrina marķēšanu/vākšanu.
Darba fāzes:
- Marķēšanas palīgs: Lietotāja gorutīnas palīdz savācējam marķēšanas fāzē, sadalot atmiņu.
- Marķēšana: Paralēla sasniedzamo objektu marķēšana.
- Marķēšanas noslēgums: Īsa STW fāze marķēšanas pabeigšanai.
- Vākšana: Paralēla nepieejamo objektu dzēšana.
Vadība:
- Automātiska.
- Atkritumu savākšanas sliekšņi regulējami ar vidi mainīgo
GOGC. Noklusējuma vērtībaGOGC=100, kas nozīmē, ka savākšana sāksies, kad kaudzes izmērs dubultosies salīdzinājumā ar iepriekšējo ciklu. - Funkcija
runtime.GC()obligāti izsauc atkritumu savākšanu, bet tās lietošana nav ieteicama standartkodā.
package main
import (
"runtime"
"time"
)
func main() {
// Piemērs obligātai GC izsaukšanai
runtime.GC()
// Piemērs iegūt GC statistiku
var memStats runtime.MemStats
runtime.ReadMemStats(&memStats)
// fmt.Printf("Kopējā piešķirtā atmiņa: %v baitu\n", memStats.TotalAlloc)
}
Priekšrocības:
- Automātiska atmiņas pārvaldība, samazina kļūdu iespējamību (atmiņas noplūdes, dubultu brīvu atbrīvošanu).
- Izstrādāts konkurētspējīgai izpildei.
Trūkumi:
- Netransparenta darba laika GC.
- Iespējams palielināt atmiņas patēriņu salīdzinājumā ar manuālo pārvaldību.