Sobes.tech
Middle+

Papaskink apie šiukšlių surinkėją (garbage collector) Go kalboje.

sobes.tech AI

Atsakymas iš AI

Go naudoja paralelinį, trijų spalvų, nekompaktinį atliekančiųjų šiukšlių rinkėją su žemais delsos laikais.

Pagrindiniai darbo principai:

  • Žymėjimas (Mark): Nustato, kurie objektai yra pasiekiami iš šakninių rodyklių (registrų, gorutinų staklių, globalių kintamųjų). Naudojamas trijų spalvų algoritmas (balta - neaplankyta, pilka - aplankyta, bet dar nepatikrinta, juoda - aplankyta ir visi palikuonys patikrinti).
  • Šalinimas (Sweep): Pašalina neprieinamus objektus (lieka balti) ir atlaisvina atmintį pakartotiniam naudojimui.

Savybės:

  • Paralelinis: Žymėjimas vyksta paraleliai su naudotojo kodo vykdymu (STW - Stop-The-World fazės yra labai trumpos).
  • Žemi delsos laikai: Sukurtas minimalizuoti pauzes programos veikloje.
  • Nekompaktinis: Neperkelia gyvų objektų atmintyje, kas gali sukelti fragmentaciją, bet supaprastina įgyvendinimą ir pagreitina žymėjimą/rinkimą.

Darbo fazės:

  1. Žymėjimo pagalbininkas: Naudotojo gorutinės padeda rinkėjui žymėjimo fazėje skiriant atmintį.
  2. Žymėjimas: Paralelinis pasiekiamų objektų žymėjimas.
  3. Žymėjimo pabaiga: Trumpa STW fazė žymėjimo užbaigimui.
  4. Šalinimas: Paralelinis neprieinamų objektų pašalinimas.

Valdymas:

  • Automatinis.
  • Atliekų rinkimo slenksčiai reguliuojami naudojant aplinkos kintamąjį GOGC. Numatytoji reikšmė GOGC=100, reiškianti, kad rinkimas prasidės, kai krūvos dydis padvigubės palyginti su ankstesniu ciklu.
  • Funkcija runtime.GC() priverstinai paleidžia šiukšlių rinkimą, bet jos naudojimas nerekomenduojamas standartiniame kode.
package main

import (
	"runtime"
	"time"
)

func main() {
	// Pavyzdys priverstinio GC iškvietimo
	runtime.GC()

	// Pavyzdys gauti GC statistiką
	var memStats runtime.MemStats
	runtime.ReadMemStats(&memStats)
	// fmt.Printf("Iš viso paskirstyta atmintis: %v baitų\n", memStats.TotalAlloc)
}

Privalumai:

  • Automatinis atminties valdymas, sumažina klaidų tikimybę (atminties nutekėjimas, dvigubas laisvavimas).
  • Sukurtas konkurentiniam vykdymui.

Trūkumai:

  • Nenumatyto darbo laiko GC.
  • Galimas atminties padidėjimas lyginant su rankiniu valdymu.