c-G-wan xbuf_xcat(),是内存泄漏吗



我在gwan上遇到了一个关于回复请求的问题,当我调用函数xbuf_xcat(get_reply(argv), replycontent)时,RSS值一直在上升。如果我评论这个函数或更改为xbuf_xcat(get_reply(argv), "value=1"),这种奇怪的现象就不会发生。。。

root 20365 0.5 0.8 4038486468pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486488pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486492pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486496pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486500pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.5 0.8 4038486504pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.6 0.8 4038486504pts/0 Sl+15:07 0:00|_/opt/gwan/gwan
root 20365 0.6 0.8 4038486528pts/0 Sl+15:07 0:00|_/opt/gwan/gwan

(如果我运行它过夜,会消耗近1GB的内存…)
知道吗??

我修改的代码:

xbuf_t *reply = get_reply(argv);
xbuf_t f;
xbuf_init(&f);
xbuf_cat(&f,replycontent);
xbuf_ncat(reply, f.ptr, f.len);
xbuf_free(&f);

以下是代码内容:(我只是不使用我写的功能,但RSS仍然每7-10秒上升一次)

int main(int argc, char *argv[]){
    printf("G-wan start Serving...n");
    char replycontent[1024];
    //set replycontent value
    strcpy(replycontent, "[");
    int i;
    for( i=0; i<2; i++){
        strcpy(replycontent, "TEST ONLY");
        strcat(replycontent, ",");
    }
    replycontent[strlen(contents)-1] = ']';
    xbuf_t *reply = get_reply(argv);
    xbuf_xcat(reply, replycontent);
    return 200;
}

RSS结果:

root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925748pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 0.7 5553925756pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927676pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927680pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927680pts/0 Sl+10:29 0:00|_/opt/gwan/gwan
root 8170 0.3 1.0 5553927684pts/0 Sl+10:29 0:00|_/opt/gwan/gwan

如果我将xbuf_xcat(reply, replycontent);更改为printf("reply:%sn",replycontent);,RSS是稳定的,但仍会突然上升。

有了xbuf_xcat(get_reply(argv), replycontent),RSS价值增长使用xbuf_xcat(get_reply(argv), "value=1"),内存使用率稳定

如工作的xbuf_xcat(reply, "value=1")所示,G-WAN会自动回收分配给reply xbuffer的内存,因此这不是问题所在。

您的问题来自于如何生成replycontent

这部分代码在您的问题中丢失了。如果你正在寻求帮助,展示你正在做的事情可能会有所帮助。


UPDATE(根据问题中的源代码披露)

您的代码使用堆栈上分配的小缓冲区,因此不会更改G-WAN的内存使用情况。

此外,您应该直接写入"reply"xbuffer,而不是写入一个临时缓冲区,然后将其复制到"reply"xbbuffer中。要进行这样的复制,您应该使用xbuf_cat()或xbuf_ncat(),而不是xbuf_xcat()。

考虑到这段代码(虽然不起眼,但毫无意义),您看到的内存"突然增加"可能来自其他脚本(处理程序?维护脚本?、操作系统/虚拟机配置?)中的问题,或者来自您在使用非常高的并发性时所做的测试。

也许你可以尝试用C之外的另一种编程语言编写G-WAN servlet(G-WAN支持15种不同的编程语言,包括Java、C#、Perl、Python、Ruby等),这将帮助你避免大多数内存分配陷阱。

这看起来像是典型的内存泄漏。

请注意,格式化函数xbuf_xcat()(在我看来,名称很奇怪)将动态分配内存来保存生成的文本。

如果不在传递给xbuf_xcat()xbuf_t上调用xbuf_free(),则内存泄漏。

相关内容

  • 没有找到相关文章

最新更新