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
newili 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 |