Предотвращение утечек памяти
Изучите распространённые шаблоны утечек в 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 — локальная установка не требуется.
Все уроки этого курса
- Основы сборщика мусора Lua
- Слабые ключи и слабые значения
- Финализаторы с __gc
- Предотвращение утечек памяти