有没有办法让Lua垃圾收集器了解userdata的内存要求?

时间:2017-03-31 22:48:59

标签: lua

我有一个C ++应用程序,它嵌入Lua并定期(每秒约10次)运行脚本,这些脚本可以创建新的userdata对象,在C ++端分配非平凡的内存量(每个〜1MiB)。当这些对象被垃圾收集时,内存被正确释放,但问题是它们似乎没有被收集,直到它太晚并且进程开始消耗过多的内存(许多GiB)。我想这是因为Lua GC认为这些对象不值得收集,因为它们在Lua端看起来很小,并且它不知道它们实际消耗了多少内存。如果这是正确的,有没有办法告诉它保持这些物体的实际成本?

对于熟悉C#的人来说,我基本上都在为Lua寻找相等的GC.AddMemoryPressure()

2 个答案:

答案 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没有这样的机制。