2010-10-07 37 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來監視您的進程並添加專用字節和虛擬字節的計數器。

當腳本以'內存不足'結尾時,請查看每個計數器的值。如果您在內存使用情況中看到突然出現的峯值,請嘗試添加更多可以打印內存使用情況的點。