0Pricing
Lua Academy · Lección

Cómo evitar fugas de memoria

Conozca los patrones habituales de fugas en Lua y las estrategias para prevenirlos.

Cómo evitar fugas de memoria es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 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 Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué es una fuga de memoria en Lua?

Se produce una fuga de memoria cuando los objetos se acumulan en la memoria porque una referencia impide que el GC los recopile, aunque el programa ya no los necesite.

Fuga común: acumulación global

Almacenar objetos en una tabla global sin eliminarlos es una fuga clásica. La tabla global siempre es una raíz del GC.

local cache = {}  -- global-like upvalue
function storeResult(key, val)
  cache[key] = val  -- never evicted!
end

Solución: caché limitada

Limite el tamaño de la caché y expulse las entradas antiguas mediante una estrategia LRU o un límite de tamaño sencillo.

local MAX = 100
local function boundedStore(cache, key, val)
  if #cache >= MAX then
    table.remove(cache, 1)  -- evict oldest
  end
  cache[key] = val
end

Fuga común: listeners de eventos

Registrar un closure como listener de eventos y no cancelar nunca su registro mantiene activos tanto el closure como sus upvalues.

local listeners = {}
function on(event, fn)
  listeners[event] = listeners[event] or {}
  listeners[event][#listeners[event]+1] = fn
end
-- Always provide off() to deregister!

Solución: tablas débiles de listeners

Almacene los listeners en una tabla de valores débiles para que, si se recopila el objeto suscriptor, su listener se elimine automáticamente.

local listeners = setmetatable({}, {__mode = "v"})

Fuga común: closures que capturan tablas grandes

Un closure que captura una tabla grande la mantiene activa mientras exista el closure, aunque solo se necesite una pequeña parte de la tabla.

local bigData = {-- 100MB of data --}
local fn = function()
  return bigData[1]  -- bigData stays alive!
end

Solución: extraer los valores necesarios

Extraiga únicamente los valores necesarios antes de crear el closure, de modo que la tabla grande pueda recopilarse.

local needed = bigData[1]
bigData = nil  -- allow collection
local fn = function() return needed end

Fugas de coroutines

Una coroutine suspendida sigue activa y conserva todas sus variables locales. Las coroutines terminadas (con estado "dead") pueden recopilarse. No pierda nunca el control de las coroutines suspendidas.

Acumulación de strings

Concatenar strings en un bucle con .. crea muchas strings intermedias. Use table.concat para construir strings grandes de forma eficiente.

local parts = {}
for i = 1, 1000 do parts[i] = tostring(i) end
local result = table.concat(parts, ",")

Depuración de fugas

Use collectgarbage("count") antes y después de las operaciones para medir el crecimiento de la memoria. Registre los crecimientos sospechosos para acotar el origen de la fuga.

local before = collectgarbage("count")
-- ... run operation ...
collectgarbage()
local after = collectgarbage("count")
print(("Delta: %.1f KB"):format(after - before))

Herramientas de profiling

Herramientas como luamemprof y contadores de asignaciones personalizados mediante debug.sethook pueden rastrear qué rutas de código asignan más memoria.

Pregunta sobre fugas de memoria

¿Qué patrón tiene más probabilidades de provocar una fuga de memoria?

Repaso: evitar fugas de memoria

Las fugas en Lua se deben a cachés sin límites, listeners cuyo registro no se cancela, closures que capturan tablas grandes y coroutines suspendidas olvidadas. Use tablas débiles, cachés limitadas y collectgarbage("count") para detectar y prevenir fugas.

Preguntas frecuentes

¿La lección «Cómo evitar fugas de memoria» es gratis?

Sí — el texto completo de «Cómo evitar fugas de memoria» 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 Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cómo evitar fugas de memoria»?

Conozca los patrones habituales de fugas en Lua y las estrategias para prevenirlos. Practicas Lua 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 Lua Academy?

No se requiere experiencia previa. Lua 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 4 de 4.

¿Cuánto tiempo toma la lección «Cómo evitar fugas de memoria»?

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 Lua Academy?

Sí. Cada lección de Lua 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

  1. Conceptos básicos del recolector de basura de Lua
  2. Claves y valores débiles
  3. Finalizadores con __gc
  4. Cómo evitar fugas de memoria
← Volver a Lua Academy