Учебники

Луа — Сборка мусора

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

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

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

Все объекты, включая таблицы, пользовательские данные, функции, потоки, строки и т. Д., Подлежат автоматическому управлению памятью. Lua использует инкрементный сборщик меток и очистки, который использует два числа для управления циклами сборки мусора, а именно паузу сборщика мусора и множитель шага сборщика мусора . Эти значения в процентах, а значение 100 часто равно 1 внутри.

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

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

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

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

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

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

  • collectgarbage («собирать») — запускает один полный цикл сборки мусора.

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

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

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

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

  • collectgarbage («шаг») — Запускает один шаг сборки мусора. Чем больше второй аргумент, тем больше будет этот шаг. Параметр collectgarbage будет возвращать значение true, если запущенный шаг был последним этапом цикла сбора мусора.

  • collectgarbage («стоп») — останавливает сборщик мусора, если он работает.

collectgarbage («собирать») — запускает один полный цикл сборки мусора.

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

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

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

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

collectgarbage («шаг») — Запускает один шаг сборки мусора. Чем больше второй аргумент, тем больше будет этот шаг. Параметр collectgarbage будет возвращать значение true, если запущенный шаг был последним этапом цикла сбора мусора.

collectgarbage («стоп») — останавливает сборщик мусора, если он работает.

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

Live Demo

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 после предварительно определенного периода.

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