Lua内存不足

时间:2010-10-07 10:38:07

标签: lua memory-management

我编写了一个使用lua套接字库的复杂lua脚本。它从磁盘读取文件列表,按日期对它们进行排序,并将它们发送到HTTP进程。磁盘上的文件数量约为65K.taskmanager中的内存使用量不超过200Mb。

经过一段时间后,脚本返回:

lua: not enough memory

我打印出点的当前GC计数,它永远不会高于110Mb

local freeMem = collectgarbage('count');
print("GC Count : " .. freeMem/1024 .. " MB");

这是在32位Windows机器上。

诊断这个的最佳方法是什么?

2 个答案:

答案 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 来监控您的进程并为专用字节和虚拟字节添加计数器。

当您的脚本以“内存不足”结束时,请查看每个计数器的值。如果您发现内存使用量突然达到峰值,请尝试添加更多打印内存使用量的点。