【问题标题】:Lua runs out of memoryLua 内存不足
【发布时间】:2010-10-07 10:38:07
【问题描述】:

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

一段时间后脚本返回:

lua: not enough memory

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

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

这是在 32 位 Windows 机器上。

诊断此问题的最佳方法是什么?

【问题讨论】:

    标签: lua memory-management


    【解决方案1】:

    所有内存都通过单个 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

    祝你好运。

    【讨论】:

      【解决方案2】:

      使用 perfmon 监控您的进程并为私有字节和虚拟字节添加计数器。

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

      【讨论】:

        猜你喜欢
        • 2014-10-15
        • 2011-05-21
        • 2021-12-20
        • 2021-10-29
        • 1970-01-01
        • 2020-03-12
        • 2015-08-11
        • 2019-06-07
        • 2019-04-19
        相关资源
        最近更新 更多