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:
- Žymėjimo pagalbininkas: Naudotojo gorutinės padeda rinkėjui žymėjimo fazėje skiriant atmintį.
- Žymėjimas: Paralelinis pasiekiamų objektų žymėjimas.
- Žymėjimo pabaiga: Trumpa STW fazė žymėjimo užbaigimui.
- Š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.