Middle
Kādas ir jūsu zināšanas par atkritumu savācēju Go valodā?
sobes.tech AI
Atbilde no AI
Golang izmanto paralēlo un zema latentuma atkritumu savākšanas algoritmu, kas balstīts uz mark-sweep.
Galvenās īpašības:
- Trīskrāsu algoritms (Three-color algorithm): Objekti tiek atzīmēti ar trim krāsām: baltu (potenciālais atkritums), pelēku (objekts ir sasniedzams, bet tā pēcnācēji nav pārbaudīti) un melnu (objekts un tā pēcnācēji ir sasniedzami).
- Paralēlisms (Parallel): Darbojas paralēli ar lietotāja gorutīnām vairākās kodolās, samazinot apstāšanās laiku.
- Konkurētspēja (Concurrent): Lielākā daļa GC darba tiek veikta vienlaikus ar programmas izpildi.
- Zema latentuma apstāšanās laiks (Low-latency Stop-The-World): Visu gorutīnu apstāšanās laiks ir ārkārtīgi īss, tiek izmantots tikai posmos "marķēšanas sākums" (start of marking) un "marķēšanas beigas" (end of marking), lai nodrošinātu objektu grafika konsekvenci.
- Atkārtoti izmantojami skenējumi (Stack scanning): Skenēšana tiek veikta arī paralēli un konkurējoši ar STW.
- Hipa pieauguma mērķis (Heap growth target): GC cenšas uzturēt noteiktu aizpildījuma procentu pēc katra cikla, lai izvairītos no pārāk biežiem vai pārāk retiem cikliem. Šo slieksni var kontrolēt ar mainīgo
GOGC. Noklusējuma vērtība irGOGC=100, kas nozīmē, ka GC tiek aktivizēts, kad hipa izmērs dubultojas.
GC darba cikls sastāv no šādām fāzēm:
- GCstart: Īsa STW fāze. Nosaka avota objektus marķēšanai.
- GCmark: Konkurētā fāze. GC pārbauda objektu grafu un atzīmē sasniedzamos objektus (pelēks -> melns). Izmanto write barrier, lai uzraudzītu izmaiņas grafā marķēšanas laikā.
- GCmarktermination: Īsa STW fāze. Pabeidz marķēšanu un pāriet uz sweep.
- GCsweep: Konkurētā fāze. Neatkarīgie (balti) objekti tiek atbrīvoti. Šī fāze var notikt fonā vai pēc nepieciešamības jaunas atmiņas piešķiršanai.
GC Go tiek automātiski pārvaldīts un lielākajā daļā gadījumu nav nepieciešama manuāla izsaukšana. GC veiktspēju var uzraudzīt, izmantojot vidi mainīgos GODEBUG=gctrace=1.
Piemērs uzraudzībai:
$ GODEBUG=gctrace=1 go run your_program.go
gctrace izvada informāciju par katru GC ciklu, ieskaitot posmu laikus, hipa izmēru un STW laiku.
Lai optimizētu GC, papildus GOGC iestatījumam, var apsvērt:
- Alokāciju skaita samazināšanu (piemēram, atkārtotu buferu izmantošanu, nevajadzīgu pārveidojumu izvairīšanos).
- Profilēšanu, izmantojot "escape analysis", lai saprastu, kuri objekti tiek alocēti hiplē.
sync.Poolizmantošanu bieži veidotu un atbrīvotu objektu pārvaldībai.