Основы сборщика мусора Lua
Изучите работу инкрементального сборщика мусора Lua: маркировку и очистку, пороги и collectgarbage().
«Основы сборщика мусора Lua» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое сборка мусора?
Lua использует автоматический сборщик мусора, чтобы освобождать память, занятую объектами (таблицами, строками, замыканиями), которые больше недоступны ни из одного корневого объекта.
Алгоритм пометки и очистки
Сборщик мусора Lua использует инкрементальный алгоритм пометки и очистки. Сначала он помечает все доступные объекты, начиная с корневых, а затем очищает (освобождает) непомеченные объекты.
Инкрементальная сборка
Сборщик мусора работает небольшими шагами, перемежающимися с выполнением программы. Это предотвращает длительные паузы. Объём работы за один шаг задаётся параметрами шага сборки мусора.
Функция collectgarbage
collectgarbage(opt, arg) напрямую управляет сборщиком мусора.
collectgarbage("collect") -- run a full GC cycle
collectgarbage("stop") -- stop automatic GC
collectgarbage("restart") -- restart automatic GC
print(collectgarbage("count")) -- KB of memory in useПараметры сборщика мусора
collectgarbage("setpause", n) задаёт паузу между циклами сборки мусора (200 = объём памяти удваивается до следующего цикла). "setstepmul" управляет скоростью сборки мусора.
collectgarbage("setpause", 200) -- default
collectgarbage("setstepmul", 200) -- defaultСлабые ссылки и сборка мусора
Обычно ссылка сохраняет объект. Слабая ссылка этого не делает: сборщик мусора может удалить объект, даже если на него указывает слабая таблица.
Поколенческая сборка мусора (Lua 5.4)
В Lua 5.4 появился необязательный поколенческий режим сборки мусора. Молодые объекты собираются часто, старые — реже. Переключить режим можно с помощью collectgarbage("generational").
Условия запуска сборки мусора
Сборщик мусора запускается автоматически, когда использование памяти превышает порог, заданный параметром pause. Выделение множества временных таблиц усиливает нагрузку на сборщик и может замедлить программу.
Снижение нагрузки на сборщик мусора
- Повторно используйте таблицы вместо создания новых.
- Избегайте создания множества короткоживущих замыканий в горячих циклах.
- Заранее выделяйте массивы известного размера.
Интернирование строк
Lua интернирует все строки: одинаковые строки используют один объект. Поэтому создание строки требует хеширования за O(n), а сравнение выполняется за O(1). Короткие строки обходятся очень дёшево.
Финализаторы (__gc)
У таблиц может быть метаметод __gc, вызываемый сборщиком мусора перед освобождением объекта. Это удобно для освобождения внешних ресурсов, например дескрипторов файлов или указателей C.
Вопрос о сборке мусора
Что возвращает collectgarbage("count")?
Повторение: основы сборки мусора в Lua
Инкрементальная сборка мусора Lua автоматически освобождает недоступную память с помощью пометки и очистки. Используйте collectgarbage, чтобы отслеживать сборку и управлять ею. Снижайте нагрузку, повторно используя таблицы и избегая чрезмерного выделения памяти на часто выполняемых участках.
Часто задаваемые вопросы
Урок «Основы сборщика мусора Lua» бесплатный?
Да — полный текст урока «Основы сборщика мусора Lua» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Основы сборщика мусора Lua»?
Изучите работу инкрементального сборщика мусора Lua: маркировку и очистку, пороги и collectgarbage(). Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Основы сборщика мусора Lua»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы сборщика мусора Lua
- Слабые ключи и слабые значения
- Финализаторы с __gc
- Предотвращение утечек памяти