我编写了一个使用lua套接字库的复杂lua脚本。它从磁盘读取文件列表,按日期对它们进行排序,并将它们发送到HTTP进程。磁盘上的文件数量约为65K.taskmanager中的内存使用量不超过200Mb。
经过一段时间后,脚本返回:
lua: not enough memory
我打印出点的当前GC计数,它永远不会高于110Mb
local freeMem = collectgarbage('count');
print("GC Count : " .. freeMem/1024 .. " MB");
这是在32位Windows机器上。
诊断这个的最佳方法是什么?
答案 0 :(得分:4)
所有内存都通过单个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。
祝你好运。答案 1 :(得分:1)
使用 perfmon 来监控您的进程并为专用字节和虚拟字节添加计数器。
当您的脚本以“内存不足”结束时,请查看每个计数器的值。如果您发现内存使用量突然达到峰值,请尝试添加更多打印内存使用量的点。