2010-10-07 343 views
2

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

相当长一段时间后,该脚本返回:

lua: not enough memory 

我打印出当前GC计数的点,它永远不会去上面110MB

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

这是一个32位的Windows机器上。

什么是最好的诊断方法?

回答

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

使用perfmon来监视您的进程并添加专用字节和虚拟字节的计数器。

当脚本以'内存不足'结尾时,请查看每个计数器的值。如果您在内存使用情况中看到突然出现的峰值,请尝试添加更多可以打印内存使用情况的点。