0Pricing
Lua Academy · Урок

Предотвращение утечек памяти

Изучите распространённые шаблоны утечек в Lua и способы их предотвращения.

«Предотвращение утечек памяти» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Что такое утечка памяти в Lua?

Утечка памяти возникает, когда объекты накапливаются в памяти, потому что ссылка не позволяет сборщику мусора удалить их, хотя программе они уже не нужны.

Распространённая утечка: накопление в глобальной таблице

Сохранение объектов в глобальной таблице без их удаления — классический пример утечки. Глобальная таблица всегда является корнем сборщика мусора.

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

Исправление: ограниченный кэш

Ограничьте размер кэша и удаляйте старые записи по стратегии LRU или при достижении простого ограничения размера.

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

Распространённая утечка: слушатели событий

Регистрация замыкания как слушателя события без последующей отмены регистрации сохраняет активными и замыкание, и его внешние переменные.

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

Исправление: слабые таблицы слушателей

Храните слушателей в таблице со слабыми значениями, чтобы при удалении объекта-подписчика его слушатель автоматически удалялся.

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

Распространённая утечка: замыкания, захватывающие большие таблицы

Замыкание, захватывающее большую таблицу, сохраняет её активной всё время существования замыкания, даже если нужна только небольшая часть таблицы.

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

Исправление: извлечение нужных значений

Извлекайте только нужные значения до создания замыкания, чтобы большую таблицу можно было удалить.

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

Утечки сопрограмм

Приостановленная сопрограмма остаётся активной и хранит все свои локальные переменные. Мёртвые сопрограммы (со статусом "dead") можно удалить. Никогда не теряйте из виду приостановленные сопрограммы.

Накопление строк

Конкатенация строк в цикле с помощью .. создаёт множество промежуточных строк. Используйте table.concat, чтобы эффективно создавать большие строки.

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

Поиск утечек

Используйте collectgarbage("count") до и после операций, чтобы измерять рост объёма памяти. Записывайте подозрительный рост в журнал, чтобы сузить поиск источника утечки.

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

Инструменты профилирования

Такие инструменты, как luamemprof, и пользовательские счётчики выделения памяти на основе debug.sethook помогают отслеживать участки кода, выделяющие больше всего памяти.

Вопрос об утечках памяти

Какая схема с наибольшей вероятностью приведёт к утечке памяти?

Итоги: предотвращение утечек памяти

Утечки в Lua возникают из-за неограниченных кэшей, слушателей, для которых не отменена регистрация, замыканий, захватывающих большие таблицы, и забытых приостановленных сопрограмм. Используйте слабые таблицы, ограниченные кэши и collectgarbage("count"), чтобы обнаруживать и предотвращать утечки.

Часто задаваемые вопросы

Урок «Предотвращение утечек памяти» бесплатный?

Да — полный текст урока «Предотвращение утечек памяти» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Предотвращение утечек памяти»?

Изучите распространённые шаблоны утечек в Lua и способы их предотвращения. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Предотвращение утечек памяти»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы сборщика мусора Lua
  2. Слабые ключи и слабые значения
  3. Финализаторы с __gc
  4. Предотвращение утечек памяти
← Назад к Lua Academy