English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Утилизация памяти Lua

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

Lua выполняетмусоросборщиксобрать всеМертвые объекты (т.е. объекты, к которым в Lua больше не можно получить доступ) для выполнения работы автоматического управления памятью. Все используемые в Lua памяти, такие как: строки, таблицы, пользовательские данные, функции, потоки, внутренние структуры и т.д., подчиняются автоматическому управлению.

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

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

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

Если вы установите шаговый коэффициент очень большим числом (больше, чем количество байт, которое может использовать ваша программа на 10%), поведение коллектора будет подобно stop-the-world коллектору. Затем, если вы установите интервал в 200, поведение коллектора будет таким же, как в过去的 версиях Lua: каждый раз, когда Lua использует вдвое больше памяти, выполняется полная сборка мусора.

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

Lua предоставляет следующие функции:collectgarbage ([opt [, arg]])Используется для управления автоматической управлением памяти:

  • collectgarbage("collect"):  Сделать один полный цикл утилизации памяти. Через параметр opt он предоставляет набор различных функций:

  • collectgarbage("count"): Вернуть общее количество используемого Lua памяти в Кбайтах. Значение имеет дробную часть, поэтому необходимо умножить на 1024, чтобы получить точное количество используемых Lua байт (за исключением переполнения).

  • collectgarbage("restart"): Перезапустить автоматическое выполнение коллектора.

  • collectgarbage("setpause"): Установить arg как интервал коллектора. Возвратить предыдущее значение интервала.

  • collectgarbage("setstepmul"): Вернуть предыдущее значение шага.

  • collectgarbage("step"): Запуск коллектора мусора шаг за шагом. Шаг "размер" контролируется аргументом arg. При传入 0 коллектор шагает (неделимый) на один шаг. При传入 не 0 значении, коллектор собирает равноценную Lua работы по распределению этих множественных (K байт) памяти. Если коллектор заканчивает цикл, он вернет true .

  • collectgarbage("stop"): Остановите работу коллектора мусора. Перед вызовом перезапуска коллектор будет запускаться только из-за явного вызова.

Далее показан пример простого примера утилизации памяти:

mytable = {"apple", "orange", "banana"}
print(collectgarbage("count"))
mytable = nil
print(collectgarbage("count"))
print(collectgarbage("collect"))
print(collectgarbage("count"))

Исполните приведенный выше код, и результат будет следующим (внимание на изменение использования памяти):

20.9560546875
20.9853515625
0
19.4111328125