Stack frente a heap y análisis de escape
Cómo decide Go dónde asignar la memoria
Stack frente a heap y análisis de escape es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
Asignación en la pila
Las variables locales que no escapan de la función se asignan en la pila de la goroutine. La asignación en la pila es rápida (solo requiere incrementar un puntero) y no tiene coste de recolección (el marco de pila se extrae al retornar).
Asignación en el heap
Las variables que escapan al heap se asignan mediante el asignador de Go y el recolector de basura realiza su seguimiento. La asignación en el heap es más lenta y aumenta la presión sobre el GC.
¿Qué provoca el escape?
Entre las causas habituales de escape se encuentran tomar la dirección de una variable local y devolverla, almacenar una variable local en una interfaz o enviarla por un canal. El análisis de escape del compilador determina estos casos.
func newUser() *User { // *User escapes to heap
return &User{Name: "Alice"}
}go build -gcflags=-m
Muestre las decisiones del análisis de escape:
go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escapePilas de las goroutines
Cada goroutine comienza con una pila pequeña (2 KiB en Go 1.14 y versiones posteriores) que crece dinámicamente según sea necesario. Las pilas son independientes del heap y se liberan cuando la goroutine termina.
Cómo evitar asignaciones
Pase valores (no punteros) para las estructuras pequeñas. Utilice arrays asignados en la pila en lugar de slices cuando se conozca el tamaño. Devuelva valores en lugar de punteros para mantenerlos en la pila.
Boxing de interfaces
Asignar un valor concreto a una interfaz hace que el valor escape al heap (boxing). En rutas críticas, acepte tipos concretos o utilice genéricos en lugar de interfaces.
sync.Pool
Reutilice objetos asignados en el heap con sync.Pool para reducir la presión sobre el GC causada por asignaciones frecuentes de objetos de corta duración (búferes y contextos de solicitud).
var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])Perfilado de asignaciones
Utilice go test -benchmem y el perfilado del heap con -alloc_space para encontrar las funciones que asignan más memoria.
slice frente a array
Un array pequeño [N]T puede permanecer en la pila. La cabecera de un slice (24 bytes) se asigna en la pila, pero su array subyacente puede escapar. La preasignación con make evita reasignaciones repetidas.
Internado de cadenas
Los literales de cadena no se asignan en el heap (se encuentran en el segmento de datos de solo lectura). Convertir []byte a string realiza una asignación. Almacene en caché las cadenas utilizadas con frecuencia para evitar conversiones repetidas.
Comprobación rápida
¿Qué hace que una variable local escape de la pila al heap?
Resumen: pila frente a heap
Puntos clave:
- Pila: GC rápido y sin coste; heap: más lento y controlado por el GC
- go build -gcflags="-m" muestra las decisiones de escape
- El boxing de interfaces, tomar la dirección de una variable local y enviar valores por canales provocan escapes
- Utilice sync.Pool para objetos que se asignan y descartan con frecuencia
Preguntas frecuentes
¿La lección «Stack frente a heap y análisis de escape» es gratis?
Sí — el texto completo de «Stack frente a heap y análisis de escape» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Stack frente a heap y análisis de escape»?
Cómo decide Go dónde asignar la memoria Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Stack frente a heap y análisis de escape»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Stack frente a heap y análisis de escape
- Modelo de memoria de Go y Happens-Before
- Internals del recolector de basura
- Reducción de asignaciones: sync.Pool y arenas