Выполнение Lua сборки мусора вызывает переполнение стека C - PullRequest
4 голосов
/ 09 апреля 2019

Я запускаю 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.

Это ожидаемое поведение? Я ожидаю, что, поскольку сборщик мусора выполняет определенную работу, он должен использовать одну и ту же память для каждого выполнения.

Есть ли способ обработки сборок мусора для улучшения этой ситуации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...