Lua内存不足

标签 lua memory-management

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

一段时间后脚本返回:

lua: not enough memory

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

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

这是在 32 位 Windows 机器上。

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

最佳答案

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

祝你好运。

关于Lua内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3880798/

相关文章:

ios - HTTPNetStreamInfo::_readStreamClientCallBack(__CFReadStream*, unsigned long) 增加内存分配

java - GC 是否将内存释放回操作系统?

c - 如何在 C 中实现重叠检查 memcpy

objective-c - 释放先前释放的对象问题

c - 从 c api 内部创建 lua 表时出错

docker - 使用 IDEA 在 Docker 中进行 Openresty LUA 远程调试

c - Lua 键名或自动索引?

lua - 什么是保护 Lua 免受缓冲区过度读取?

database - 雷迪斯 + 路亚。我可以返回结果而不将其存储在内存中吗?

c++ - 使用 c++ std::unique_ptr<> 或 std::shared_ptr<> 管理 objective-C 对象