Lua - Сборка мусора

Lua использует автоматическое управление памятью, которое использует сборку мусора на основе определенных алгоритмов, встроенных в Lua. В результате автоматического управления памятью, как разработчик -

  • Не нужно беспокоиться о выделении памяти для объектов.
  • Нет необходимости освобождать их, когда они больше не нужны, за исключением установки значения nil.

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

Все объекты, включая таблицы, пользовательские данные, функции, поток, строку и так далее, подлежат автоматическому управлению памятью. Lua использует инкрементный сборщик меток и очистки, который использует два числа для управления циклами сборки мусора, а именно:garbage collector pause и garbage collector step multiplier. Эти значения выражены в процентах, и значение 100 часто внутренне равно 1.

Пауза сборщика мусора

Пауза сборщика мусора используется для контроля того, как долго сборщик мусора должен ждать раньше; он снова вызывается автоматическим управлением памятью Lua. Значения меньше 100 означают, что Lua не будет ждать следующего цикла. Точно так же более высокие значения этого значения приведут к тому, что сборщик мусора будет медленным и менее агрессивным по своей природе. Значение 200 означает, что сборщик ожидает удвоения общего объема используемой памяти перед началом нового цикла. Следовательно, в зависимости от природы и скорости приложения может потребоваться изменить это значение, чтобы получить максимальную производительность в приложениях Lua.

Множитель шагов сборщика мусора

Этот множитель шагов управляет относительной скоростью сборщика мусора по отношению к скорости выделения памяти в программе Lua. Большие значения шага приведут к тому, что сборщик мусора будет более агрессивным, а также увеличит размер шага каждого инкрементного шага сборки мусора. Значения меньше 100 часто могут привести к тому, что сборщик мусора не завершит свой цикл, и это обычно не является предпочтительным. Значение по умолчанию - 200, что означает, что сборщик мусора работает вдвое быстрее, чем выделение памяти.

Функции сборщика мусора

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

  • collectgarbage("collect") - Выполняет один полный цикл сборки мусора.

  • collectgarbage("count") - Возвращает объем памяти, который в настоящее время используется программой в килобайтах.

  • collectgarbage("restart") - Если сборщик мусора был остановлен, он перезапускает его.

  • collectgarbage("setpause")- Устанавливает значение, указанное как второй параметр, деленное на 100 для переменной паузы сборщика мусора. Его использование описано немного выше.

  • collectgarbage("setstepmul")- Устанавливает значение, указанное как второй параметр, деленное на 100, для переменной множителя шага мусора. Его использование описано немного выше.

  • collectgarbage("step")- Выполняет один шаг сборки мусора. Чем больше второй аргумент, тем больше будет этот шаг. Сборщик мусора вернет истину, если запущенный шаг был последним шагом цикла сборки мусора.

  • collectgarbage("stop") - Останавливает сборщик мусора, если он запущен.

Ниже показан простой пример с использованием сборщика мусора.

mytable = {"apple", "orange", "banana"}

print(collectgarbage("count"))

mytable = nil

print(collectgarbage("count"))

print(collectgarbage("collect"))

print(collectgarbage("count"))

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

23.1455078125   149
23.2880859375   295
0
22.37109375     380

Как видно из приведенной выше программы, после завершения сборки мусора объем используемой памяти уменьшился. Но называть это необязательно. Даже если мы их не вызываем, он будет выполнен автоматически на более позднем этапе интерпретатором Lua по истечении предопределенного периода.

Очевидно, мы можем изменить поведение сборщика мусора с помощью этих функций, если это необходимо. Эти функции предоставляют разработчику дополнительные возможности для работы в сложных ситуациях. В зависимости от типа памяти, необходимой для программы, вы можете использовать или не использовать эту функцию. Но очень полезно знать использование памяти в приложениях и проверять это во время самого программирования, чтобы избежать нежелательных результатов после развертывания.