Sobes.tech
Middle+

Cum este structurată stiva în limbajul Go?

sobes.tech AI

Răspuns de la AI

În Golang, heap-ul este o zonă de memorie unde sunt plasate obiectele alocate dinamic. Gestionarea acestei memorii se face automat de către colectorul de gunoi.

Aspecte cheie:

  • Alocare dinamică: Obiectele mici și de scurtă durată, pentru care compilatorul nu poate demonstra că timpul lor de viață este limitat de limitele funcției sau ale stivei, sau care sunt alocate cu new sau prin preluarea adresei (&), sunt de obicei plasate în heap.
  • Colector de gunoi (GC): Go folosește un colector de gunoi concurent, cu trei culori, Mark-and-Sweep. Funcționează în paralel cu execuția programului, minimizând pauzele.
    • Marcaj (Mark): GC parcurge obiectele accesibile din pointerii rădăcină (variabile locale pe stivă, variabile globale) și le marchează ca "vii".
    • Curățare (Sweep): GC parcurge întregul heap accesibil și eliberează memoria ocupată de obiectele care nu au fost marcate ca "vii".
    • Concurent: GC funcționează în goroutines separate, reducând întârzierile în programul principal.
  • Analiza de scăpare: Compilatorul Golang efectuează o analiză (escape analysis) pentru a determina dacă o variabilă sau o valoare indică spre stivă sau spre heap. Dacă o variabilă sau un câmp structural poate fi accesibil după întoarcerea din goroutine-ul curent, probabil va fi alocat în heap. În caz contrar, poate fi alocat pe stivă.
    // Exemplu de analiză de scăpare.
    // Acest obiect va fi probabil alocat în heap,
    // deoarece returnează un pointer.
    func createPoint() *Point {
        p := Point{X: 1, Y: 2}
        return &p // Pointer "scapă" din funcție
    }
    
    // Acest obiect va fi probabil alocat pe stivă,
    // deoarece nu este accesibil după finalizarea funcției.
    func processValue() {
        val := 10
        println(val)
    }
    
    type Point struct {
        X, Y int
    }
    
  • Divizare în arene: Heap-ul în Go poate fi împărțit în mai multe arene, ceea ce ajută colectorul de gunoi să funcționeze mai eficient, mai ales pe sistemele multiprocesor.
  • Utilizarea mmap: Golang folosește apelul de sistem mmap (Memory Map) pentru a aloca blocuri mari de memorie virtuală pentru heap.
  • Continuitate: Spre deosebire de unele limbaje, Go nu garantează continuitatea fizică a obiectelor în heap. Memoria poate fi fragmentată.
  • Lipsa gestionării manuale a memoriei: Dezvoltatorul nu trebuie să aloce sau să elibereze explicit memoria în heap. GC face acest lucru automat.

Stiva și heap-ul în Golang îndeplinesc roluri diferite:

Zonă de memorie Scop Gestionare Durata de viață
Stivă Variabile locale, parametri de funcție, adrese de returnare Automat (la intrarea/ieșirea din funcție) Limitată la timpul de execuție al funcției
Heap Obiecte alocate dinamic, cele care "scapă" din stivă, structuri mari Colector de gunoi (GC) Determinată de accesibilitatea obiectului din rădăcini