Middle+
Kaip yra sukonstruotas Go kalbos krūva?
sobes.tech AI
Atsakymas iš AI
Golango kalboje, heap yra atminties sritis, kurioje yra išdėstyti dinamiškai paskirti objektai. Šios atminties valdymas yra automatinis naudojant šiukšlių surinkėją:
Pagrindiniai aspektai:
- Dinaminis paskirstymas: Mažo dydžio ir trumpalaikiai objektai, kurių gyvavimo laikas negali būti įrodytas kaip apribotas funkcijos ar steko ribų, arba kurie paskiriami naudojant
newarba adresą (&), paprastai yra išdėstyti heap'e. - Šiukšlių surinkėjas (GC): Go naudoja paralelinį, trijų spalvų, Mark-and-Sweep šiukšlių surinkėją. Jis veikia kartu su programos vykdymu, minimalizuodamas pauzes.
- Mark (Žymėjimas): GC pereina prieinamus objektus iš šakninių rodyklių (vietinių kintamųjų steke, globalių kintamųjų) ir juos pažymi kaip "gyvus".
- Sweep (Valymas): GC pereina visą prieinamą heap ir atlaisvina atmintį, užimtą objektais, kurie nebuvo pažymėti kaip "gyvi".
- Paralelinis: GC veikia atskirose gorutinuose, sumažindamas vėlavimus pagrindinėje programoje.
- Escape Analysis: Golango kompiliatorius atlieka analizę (escape analysis), kad nustatytų, kur nurodo kintamasis ar reikšmė — į steką ar į heap'ą. Jei kintamasis ar struktūrinis laukas gali būti pasiekiamas po dabartinės gorutinos grįžimo, jis tikriausiai bus paskirtas heap'e. Kitaip, steke.
// Escape analysis pavyzdys: // Šis objektas tikriausiai bus paskirtas heap'e, // nes grąžinamas rodyklė: func createPoint() *Point { p := Point{X: 1, Y: 2} return &p // Rodyklė "bėga" iš funkcijos } // Šis objektas tikriausiai bus paskirtas steke, // nes jis nėra pasiekiamas po funkcijos pabaigos: func processValue() { val := 10 println(val) } type Point struct { X, Y int } - Arenų skaidymas: Golango heap gali būti padalintas į kelias arenas, tai padeda šiukšlių surinkėjui veikti efektyviau, ypač daugiašaliuose sistemose.
- Naudojant mmap: Golang naudoja sisteminį iškvietimą
mmap(Memory Map) dideliems virtualios atminties blokams paskirstyti heap'ui. - Nuoseklumas: Skirtingai nuo kai kurių kalbų, Go garantuoja fizinį objektų nuoseklumą heap'e. Atmintis gali būti fragmentuota.
- Rankinis atminties valdymo nebuvimas: Programuotojas neturi aiškiai paskirti ar atlaisvinti atmintį heap'e. GC tai daro automatiškai.
Stekas ir heap Golangoje atlieka skirtingas funkcijas:
| Atminties sritis | Paskirtis | Valdymas | Gyvenimo trukmė |
|---|---|---|---|
| Stekas | Vietinės kintamosios, funkcijų parametrai, grąžinimo adresai | Automatinis (įėjimo/išeigos metu) | Apribotas funkcijos vykdymo laiku |
| Heap | Dinamiškai paskirti objektai, kurie "bėga" iš steko, didelės struktūros | Šiukšlių surinkėjas (GC) | Nustatoma pasiekiamumo iš šaknų |