如何删除 Lua 模块的所有代码和内存空间

我有一个长时间运行的程序,它是一个播放器。启动后,它会通过服务器的指令从网络上加载并运行 Lua 代码。每个代码都有一个唯一的命名模块。

每天,它需要加载一系列不同的代码(即 Lua 模块)并运行它们。我担心长时间后会导致内存溢出……

所以,我的问题是:Lua 模块可以被删除吗?我想删除不再使用的模块。

点赞
用户1022729
用户1022729

在 Lua 中,模块只是另一个包含所有函数和变量的表格。如果您将其设置为 nil 并删除 package.loaded 中的条目,它应该被垃圾回收器清除。

以下是一个实现模块卸载的函数: http://lua-users.org/lists/lua-l/2009-03/msg00587.html

2013-08-07 07:43:04
用户646619
用户646619

对于使用Lua编写的模块,将package.loaded中的条目设置为nil可能会起作用。但是,这是一种hack,不应用于任意模块(尤其是C模块)。

来自LuaJIT开发人员Mike Pall的说法:

“实际上,即使对于普通的Lua,也没有安全的方法来卸载任意模块。 C模块可能相互依赖,以错误的顺序卸载它们将导致混乱。而且,如果仍然有一个包含__gc C函数的userdata存在,而您又使用上述方法从地址空间中删除共享库...那么想一想会发生什么。 ”

【来源】(http://www.freelists.org/post/luajit/BUG-Assertion-failures-when-unloading-and-reloading-the-ffi-package,1)

对于您的情况,考虑不使用modulerequire,而是制作自己的简单系统,利用loadstring等函数。

2013-08-07 17:36:31