LUA скрипт Просто о простом. Сборщик мусора

Разработчик
Статус
Оффлайн
Регистрация
1 Сен 2018
Сообщения
1,597
Реакции[?]
881
Поинты[?]
116K
Всем привет! Это вторая часть серии статей просто о простом, и в этой статье мы немного повысим уровень сложности понятия концепций.

Введение
Будучи передовым, и мощным языком программирования Lua имеет множество сложных, и часто не понятных пользователями функций. Сборщик мусора обычно возглавляет этот список, но не сегодня! Мы разберём все детали этого элемента самым простым языком.

Что же такое сборщик мусора?
В Lua сборщик мусора - это mark-and-sweep коллектор с несколькими опциями, которые позволяют его адаптировать под различные потребности.
Я догадываюсь, что в вашей голове встал вопрос: “Сборка мусора? Разве это не для Java / JavaScript программистов, которым не хватает интеллекта управлять собственной памятью?”
Не хочу вас обижать, но ваше мнение ошибочно, сборка мусора это гораздо громоздкий процесс, чем вы думаете.

На самом деле сборщик мусора это аналог Наофуми из Героя щита ( т.е герой достижения которого переносят на другие процессы ), но в Lua. Без него ваши скрипты быстро стали бы неэффективными, раздутыми да и в общем неуправляемыми. Не говоря уже о том, что утечки памяти были бы вашим главным врагом, и сконцентрироваться на разработке, а не на оптимизации было бы почти невозможно.

Как он работает?
Работа mark-and-sweep заключается в том, чтобы сначала начиная с набора рутов пометить все доступные объекты в куче как “Живые”, затем проходя через кучу выявить все объекты, которые не были помечены как “живые”, и освободить их память.

Рут ( с англ. - “корень ) это переменная или структура которая доступна программе, и предположительно еще используется. В сборщике мусора это глобальная переменная ( не обязательно глобальная) которая находится в стеке вызовов.

Особенности сборщика мусора в Lua
Инкрементность
Одной из ключевых особенностей сборщика мусора в Lua является инкрементность. Что это? Это возможность его распределить свою работу на несколько разных вызовов, это позволяет скриптам работать даже в то время, когда сборщик мусора выполняет работу!

В топку молодых
Следующей особенностью сборщика Lua это поддержка разделения объектов на 2 категории: “Старые” и “Молодые” в зависимости от их возраста. Молодые объекты с большей вероятностью являются мусором, поэтому сборщик мусора может очищать их чаще, чтобы избежать фрагментации памяти. А вот старые объекты освобождаются реже, так как они долгоживущие, и шанс того что они окажутся мусором гораздо меньше.

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

Вызов сборщика мусора вручную
Хоть сборщик мусора в Lua предназначен для автоматической периодической сборки ( согласен, немного душновато), но ничего не мешает вам вызвать его в ручную, это может быть нужно в некоторых ситуациях, например:
  • При необходимости срочно освободить память
  • При работе с большим количеством данных
И многих других ситуациях.

Чтобы вызвать сборщик мусора вручную можно воспользоваться функцией “collectgarbage”. Она принимает аргумент в виде строки, который определяет тип сборки мусора, например: “collect” запускает полный сбор мусора, а “count” показывает информацию об объеме памяти использующийся в данный момент.
Но стоит понимать, что вы делаете при вызове сборщика мусора, и не злоупотреблять этим. Ведь слишком частая сборка мусора может вызвать проблемы с производительностью. Поэтому в целом лучше доверьте эту работу автоматическому сборщику

Настраиваем сборщик мусора

Lua
Тут всё очень просто, используя функцию ранее мы можем конфигурировать наш сборщик мусора, список всех параметров:
  • “collect: Запускает сборщик мусора
  • “count”: Возвращает использование памяти Lua в КБ.
  • “step”: Выполняет сборку мусора с инкрементным подходом, стоит обратить на это внимание если не хотите длительной паузы в вашем скрипте
  • “setpause”: Устанавливает значение времени паузы между циклами сборщика мусора
  • “setstepmul”: Устанавливает значение множителя шага, который используется для управления скоростью инкрементальной сборки мусора
  • "setlimit”: Устанавливает предел памяти, то есть максимальный объем памяти, который Lua может использовать до запуска цикла сборки мусора.
Пример использования параметров в коде:
code_language.lua:
-- Устанавливаем максимальное использование памяти на 25 МБ

collectgarbage("setlimit", 25000)

-- Запускаем сборщик более часто
collectgarbage("setstepmul", 200)

-- Включаем инкрементнуюю сборку мусора
collectgarbage("setpause", 200)
collectgarbage("step", 1)
collectgarbage("setpause", 100)
collectgarbage("step", 1)
collectgarbage("setpause", 50)
C / C++
Для Lua в C простым образом можно настроить сборщик мусора, используя ряд параметров, которые управляют его поведением. Давайте поговорим о самых важных:
  • gcinterval: Этот параметр регулирует частоту запуска сборщика мусора. Измеряется в выполненных инструкция, меньший интервал приводит более частую сборку мусора. Можно установить через lua_gc
  • gcstepmul: Параметр, который контролирует сколько работы сборщик выполняет на каждом шаге относительно используемой памяти. При использовании уменьшении можно уменьшить длительность пауз в программе. Можно установить через lua_gc
  • gcres: Размер внутреннего буфера памяти сборщика мусора, который используется для хранения временных объектов. При увеличении может положительно сказаться на производительности. Можно установить с помощью макроса LUA_GCSETSTEPMUL
  • gcstop: Максимальное время сборки в секундах Можно установить с помощью макроса LUA_GCSETSTEPMUL
  • gcinc: Отвечает за использование инкрементной сборки, включен по умолчанию. Можно установить через lua_gc
  • gcpause: Аналог setlimit. Можно установить через lua_gc

Пример в коде:

C++:
int main()

{

// Создаём луа стейт

lua_State* pLuaState = luaL_newstate();


// Устанавливаем

lua_gc(pLuaState, LUA_GCCOLLECT, 0);


// Закрываем луа стейт

lua_close(pLuaState);


return 0;

}
Заключение
В заключение хочу сказать, что хоть сборщик мусора и не умеет генерировать аниме женщин, но это довольно мощная функций в Lua ( да и не только ) которая является ярким примером пословицы с Человека-паука - “С большой силой приходит большая ответственность”. При правильном использовании сборщика мусора можно достигнуть максимально удобной, и в тоже время эффективной разработки, но если лишь немного отклониться можно сделать вашу программу неконтролируемой. Спасибо!


Если кому-то удобно читать на Notion, то ссылку можно найти в моём канале -
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Последнее редактирование:
Nike.lua
Олдфаг
Статус
Оффлайн
Регистрация
13 Окт 2020
Сообщения
2,746
Реакции[?]
1,465
Поинты[?]
2K
Здравствуйте, можно, пожалуйста, поподробнее про аниме женщин?
 
Сверху Снизу