Как отбросить весь код и объем памяти модуля 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