Я запускаю Lua в среде микроконтроллера, используя RTOS.
Доступные ресурсы очень ограничены (всего несколько килобайт ОЗУ), и я стараюсь убедиться, что Lua будет работать правильно в этой среде.
Чтобы провести стресс-тестирование всей прошивки и убедиться, что память обрабатывается правильно, я загрузил скрипт, который по существу выполняет следующие действия:
index = 1
data = {}
-- This function is called repeatedly, till memory exhaustion.
function test()
data[index] = 5
data[index + 1] = 6
data[index + 2] = 7
index = index + 3
end
От этой функции я ожидаю, что Lua исчерпает память ( heap memory, из-за непрерывного выделения).
К моему удивлению, программа провалилась по-другому.
Поскольку использование памяти увеличивается, Lua вызывает сборщик мусора, чтобы освободить часть памяти. Каждый раз, когда работает сборщик мусора, он использует все больше и больше стека, что приводит к переполнению стека задолго до того, как куча будет исчерпана. Кажется, что независимо от того, насколько я увеличу размер стека, сборщик мусора сожрет все это очень скоро.
Обратите внимание, что я говорю здесь о стеке времени выполнения C, фактической памяти, к которой процессор обращается на оборудовании, а не о стеке Lua API.
Это ожидаемое поведение? Я ожидаю, что, поскольку сборщик мусора выполняет определенную работу, он должен использовать одну и ту же память для каждого выполнения.
Есть ли способ обработки сборок мусора для улучшения этой ситуации?