0Pricing
Go Academy · Lezione

Stack, heap ed escape analysis

Come Go decide dove allocare la memoria

Stack, heap ed escape analysis è una lezione Go Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Go Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Go Academy include 4 lezioni in totale.

Allocazione nello stack

Le variabili locali che non escono dalla funzione vengono allocate nello stack della goroutine. L'allocazione nello stack è rapida (consiste semplicemente nell'incrementare un puntatore) e non ha costi di raccolta (il frame dello stack viene rimosso al ritorno).

Allocazione nell'heap

Le variabili che sfuggono nell'heap vengono allocate dall'allocator di Go e monitorate dal garbage collector. L'allocazione nell'heap è più lenta e aumenta il carico sul GC.

Che cosa causa l'escape?

Cause comuni dell'escape: prendere l'indirizzo di una variabile locale e restituirlo, memorizzare una variabile locale in un'interfaccia oppure inviarla su un canale. È l'escape analysis del compilatore a determinarlo.

func newUser() *User { // *User escapes to heap
    return &User{Name: "Alice"}
}

go build -gcflags=-m

Stampa le decisioni dell'escape analysis:

go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escape

Stack delle goroutine

Ogni goroutine inizia con uno stack di piccole dimensioni (2 KiB in Go 1.14+) che cresce dinamicamente secondo necessità. Gli stack sono separati dall'heap e vengono raccolti quando la goroutine termina.

Evitare le allocazioni

Passi valori, non puntatori, per le struct di piccole dimensioni. Utilizzi array allocati nello stack invece di slice quando la dimensione è nota. Restituisca valori invece di puntatori per mantenerli nello stack.

Boxing delle interfacce

L'assegnazione di un valore concreto a un'interfaccia fa sì che il valore sfugga nell'heap (boxing). Nei percorsi ad alta frequenza, accetti tipi concreti o utilizzi i generics invece delle interfacce.

sync.Pool

Riutilizzi gli oggetti allocati nell'heap con sync.Pool per ridurre il carico sul GC dovuto alle frequenti allocazioni di oggetti di breve durata (buffer, contesti delle richieste).

var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])

Profilazione delle allocazioni

Utilizzi go test -benchmem e la profilazione dell'heap con -alloc_space per individuare le funzioni che allocano più memoria.

slice e array

Un array di piccole dimensioni [N]T può rimanere nello stack. L'header di una slice (24 byte) viene allocato nello stack, ma il suo backing array può sfuggire nell'heap. Preallocare con make evita riallocazioni ripetute.

Interning delle stringhe

I letterali stringa non vengono allocati nell'heap (si trovano nel segmento di dati in sola lettura). La conversione da []byte a string comporta un'allocazione. Metta in cache le stringhe usate frequentemente per evitare conversioni ripetute.

Verifica rapida

Che cosa fa sfuggire una variabile locale dallo stack all'heap?

Riepilogo: stack e heap

Punti chiave:

  • Stack: rapido, GC senza costi; heap: più lento, monitorato dal GC
  • go build -gcflags="-m" mostra le decisioni sull'escape
  • Il boxing delle interfacce, l'operatore address-of su variabili locali e gli invii sui canali causano escape
  • Utilizzi sync.Pool per gli oggetti allocati ed eliminati frequentemente

Domande Frequenti

La lezione «Stack, heap ed escape analysis» è gratuita?

Sì — il testo completo di «Stack, heap ed escape analysis» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Go Academy, passa a CoddyKit PRO. Il corso Go Academy include 4 lezioni in totale.

Cosa imparerò in «Stack, heap ed escape analysis»?

Come Go decide dove allocare la memoria Eserciti Go Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Go Academy?

Non è richiesta alcuna esperienza precedente. Go Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Stack, heap ed escape analysis»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Go Academy?

Sì. Ogni lezione Go Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Stack, heap ed escape analysis
  2. Modello di memoria di Go e happens-before
  3. Interni del garbage collector
  4. Ridurre le allocazioni: sync.Pool e arena
← Torna a Go Academy