Как отбросить весь код и объем памяти модуля Lua

У меня давно летает программа, это плеер. После запуска он загружает и запускает код Lua из сети по команде сервера. Каждый код имеет уникальный именованный модуль.

Каждый день необходимо загружать серийный код (например, модули Lua) и запускать их. Я волновался, что память переполнится через долгое время...

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

2 ответа

Решение

Для модулей, написанных на Lua, установите запись в package.loaded ноль, вероятно, будет работать. Тем не менее, это взлом, и не должен использоваться для произвольных модулей (особенно модулей C)

От Майка Полла, разработчика LuaJIT:

На самом деле, не существует безопасного способа выгрузки произвольных модулей, даже для простого Lua. Модули Си могут зависеть друг от друга, и выгрузка их в неправильном порядке приведет к хаосу. И если все еще есть пользовательские данные с функцией __gc C, и вы удаляете разделяемую библиотеку из адресного пространства вышеуказанным методом... угадайте, что произойдет.

Источник

Для вашего случая рассмотрите не использовать module а также requireи вместо этого создайте свою собственную, более простую систему, которая использует такие функции, как loadstring

Модуль в Lua - это просто еще одна таблица со всеми функциями и переменными внутри. Если вы установите ноль и удалите запись в package.loaded, он должен быть очищен сборщиком мусора.

Вот функция, реализующая выгрузку модуля: http://lua-users.org/lists/lua-l/2009-03/msg00587.html

Другие вопросы по тегам