我编写了一个复杂的 lua 脚本,它使用 lua 套接字库。它从磁盘读取文件列表,按日期对它们进行排序并将它们发送到 HTTP 进程。磁盘上的文件数量约为65K。任务管理器中的内存使用量不超过200Mb。
一段时间后脚本返回:
lua: not enough memory
我打印出当前的 GC 计数,但它永远不会超过 110Mb
local freeMem = collectgarbage('count');
print("GC Count : " .. freeMem/1024 .. " MB");
这是在 32 位 Windows 机器上。
诊断此问题的最佳方法是什么?
最佳答案
所有内存都经过单个 lua_Alloc 函数。这采取以下形式:
typedef void* (*lua_Alloc) (void* ud, void* ptr, size_t oszie, size_t nsize);
所有分配、重新分配和释放都会经过此过程。有关此内容的文档可以在 this web page 找到。 。您可以轻松编写自己的程序来跟踪所有内存操作。例如,
void* MyAlloc (void* ud, void* ptr, size_t osize, size_t nsize)
{
(void)ud; (void)osize; // Not used
if (nsize == 0)
{
free(ptr)
TrackSubtract(osize);
return NULL;
}
else
{
void* p = realloc(ptr,nsize);
TrackSubtract(osize);
if (p) TrackAdd(nsize);
return p;
}
}
您可以将 TrackAdd() 和 TrackSubtract() 函数写入任何您想要的内容:输出到日志;调整计数器等。
要使用新函数,请在创建 Lua 状态时传递一个指向它的指针:
lua_State* L = lua_newstate(&MyAlloc,0);
找到 lua_newstate 的文档 here .
祝你好运。
关于Lua内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880798/