Sobes.tech
Middle+

Jak je uspořádána zásobník v jazyce Go?

sobes.tech AI

Odpověď od AI

V Golangu je halda (heap) oblast paměti, kde jsou umístěny dynamicky alokované objekty. Správa této paměti je automatická pomocí garbage collectoru.

Klíčové aspekty:

  • Dynamická alokace: Objektů menšího rozsahu a krátkého životního cyklu, u nichž překladač nemůže dokázat, že jejich životnost je omezená rámcem funkce nebo zásobníku, nebo které jsou alokovány pomocí new nebo získáním adresy (&), jsou obvykle umístěny na haldě.
  • Garbage collector (GC): Go používá paralelní, tříbarevný, Mark-and-Sweep garbage collector. Funguje současně s během programu, minimalizujíc přestávky.
    • Mark (Značení): GC prohledává dosažitelné objekty z kořenových ukazatelů (lokální proměnné na zásobníku, globální proměnné) a označuje je jako "živé".
    • Sweep (Pročištění): GC prohledá celý dostupný hald a uvolní paměť obsazenou objekty, které nebyly označeny jako "živé".
    • Paralelně: GC běží v samostatných gorutinách, snižujíc zpoždění hlavního programu.
  • Escape Analysis: Kompilátor Golang provádí analýzu (escape analysis), aby určil, kam ukazuje proměnná nebo hodnota — na zásobník nebo na haldu. Pokud je proměnná nebo strukturové pole dostupné po návratu z aktuální gorutiny, pravděpodobně bude alokováno na haldě. Jinak na zásobníku.
    // Příklad escape analysis.
    // Tento objekt bude pravděpodobně alokován na haldě,
    // protože se vrací ukazatel.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Ukazatel "utíká" z funkce
    }
    
    // Tento objekt bude pravděpodobně alokován na zásobníku,
    // protože není dostupný po ukončení funkce.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Rozdělení na arény (Arenas): Hald v Golangu může být rozdělen na několik arén, což pomáhá efektivněji pracovat s garbage collectorem, zejména na systémech s více procesory.
  • Použití mmap: Golang používá systémový volání mmap (Memory Map) pro alokaci velkých bloků virtuální paměti pro haldu.
  • Nepřerušovanost: Na rozdíl od některých jazyků, Go nezaručuje fyzickou kontinuitu objektů na haldě. Paměť může být fragmentovaná.
  • Chybějící manuální správa paměti: Vývojář nemusí explicitně alokovat nebo uvolňovat paměť na haldě. GC to dělá automaticky.

Zásobník a halda v Golangu plní různé role:

Oblast paměti Účel Správa Doba životnosti
Zásobník Lokální proměnné, parametry funkcí, návratové adresy Automatická (při vstupu/výstupu z funkce) Omezená dobou běhu funkce
Hald Dynamicky alokované objekty, které "utíkají" ze zásobníku, velké struktury Sběrač odpadků (GC) Určuje dosažitelnost objektu z kořenů