我有一个C ++应用程序,它嵌入Lua并定期(每秒约10次)运行脚本,这些脚本可以创建新的userdata对象,在C ++端分配非平凡的内存量(每个〜1MiB)。当这些对象被垃圾收集时,内存被正确释放,但问题是它们似乎没有被收集,直到它太晚并且进程开始消耗过多的内存(许多GiB)。我想这是因为Lua GC认为这些对象不值得收集,因为它们在Lua端看起来很小,并且它不知道它们实际消耗了多少内存。如果这是正确的,有没有办法告诉它保持这些物体的实际成本?
对于熟悉C#的人来说,我基本上都在为Lua寻找相等的GC.AddMemoryPressure()。
答案 0 :(得分:0)
您目前最接近的事情是LUA_GCSTEP
。手册说:
lua_gc
int lua_gc (lua_State *L, int what, int data);
控制垃圾收集器。 [...]有关这些选项的更多详细信息,请参阅
collectgarbage
。
collectgarbage ([opt [, arg]])
此函数是垃圾收集器的通用接口。它根据第一个参数
执行不同的功能opt
:[...]
- " step" :执行垃圾收集步骤。步骤"尺寸"由
arg
控制。如果值为零,则收集器将执行一个基本(不可分割)步骤。 对于非零值,收集器将执行就像Lua已分配内存量(以KB为单位)。如果步骤完成收集周期,则返回 true 。
(强调我的)
这将使GC前进一次(好像分配了很多),但不保留该信息,这意味着影响未来集合行为的参数(GC暂停长度,使用的总内存等)没有受到影响。 (因此,检查一下这项工作是否适合您,以及它是否可以尝试使用GC pause and step multiplier。)
答案 1 :(得分:0)
没有。 Lua没有这样的机制。