Sobes.tech
Middle+

Kako je struktuisana stog u jeziku Go?

sobes.tech АИ

Одговор од АИ

U Golang-u, heap je oblast memorije gde se smeštaju dinamički alocirani objekti. Upravljanje ovom memorijom se obavlja automatski putem sakupljača smeća.

Ključni aspekti:

  • Dinamička alokacija: Objekti manjeg formata i kratkog veka, gde prevodilac ne može da dokaže da je njihov vek ograničen granicama funkcije ili steka, ili koji se alociraju pomoću new ili dobijanjem adrese (&), obično se smeštaju u heap.
  • Sakupljač smeća (GC): Go koristi paralelni, trobojnicki, Mark-and-Sweep sakupljač smeća. On radi istovremeno sa izvršavanjem programa, minimizirajući pauze.
    • Mark (Označavanje): GC prolazi kroz dostupne objekte iz korenskih pokazivača (lokalne promenljive na steku, globalne promenljive) i označava ih kao "žive".
    • Sweep (Čišćenje): GC prolazi kroz celokupni dostupni heap i oslobađa memoriju zauzetu objektima koji nisu označeni kao "živi".
    • Paralelno: GC radi u odvojenim gorutinama, smanjujući kašnjenja u glavnom programu.
  • Escape Analysis: Kompajler Golang vrši analizu (escape analysis) da odredi gde pokazuje promenljiva ili vrednost — na stek ili na heap. Ako promenljiva ili strukturalno polje može biti dostupno nakon povratka iz trenutne gorutine, verovatno će biti alocirano na heap.
    // Primer escape analysis.
    // Ovaj objekat će verovatno biti alociran na heap,
    // jer se vraća pokazivač.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Pokazivač "beži" iz funkcije
    }
    
    // Ovaj objekat će verovatno biti alociran na steku,
    // jer nije dostupan nakon završetka funkcije.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Podela na arene (Arenas): Heap u Golangu može biti podeljen na više arena, što pomaže sakupljaču smeća da radi efikasnije, posebno na sistemima sa više procesora.
  • Korišćenje mmap: Golang koristi sistemski poziv mmap (Memory Map) za alokaciju velikih blokova virtuelne memorije za heap.
  • Neprekidnost: Za razliku od nekih jezika, Go ne garantuje fizičku kontinuitet objekata u heap-u. Memorija može biti fragmentisana.
  • Nedostatak ručne upravljanja memorijom: Programer ne mora eksplicitno da alocira ili oslobađa memoriju u heap-u. GC to radi automatski.

Stek i heap u Golangu obavljaju različite uloge:

| Oblast memorije | Namenjenje | Upravljanje | Vreme trajanja |