linuxfellow 发表于 2015-03-17 23:58

回复 10# 镇水铁牛
会不会接收进程优先级太低,接到的信息来不及处理,全部堆在那里?
我找找发送端代码,贴上来

   

linuxfellow 发表于 2015-03-18 04:34

我好像找到问题了:
zmq_msg_init 应该是没有把以前在heap 里分配的指针free. 它只是在heap里再申请一块新的。每次循环调用这个函数时就申请一块新的。heap size自然就增加了。

linuxfellow 发表于 2015-03-18 04:59

那个代码对小message完全没问题。如果对大的message 就没有释放为content 指针分配的内存

linuxfellow 发表于 2015-03-18 06:02

本帖最后由 linuxfellow 于 2015-03-18 07:26 编辑

回复 10# 镇水铁牛
   如果zmq是大的message,zmq_msg_close (&zmq) 有没有释放zmq.content所指的内存? 我的理解是没有。zmq.content所指的内存没有释放,下次循环就不能用zmq_msg_init; 应该用zmq_msg_init_data.传一个free_mem函数进去释放zmq.content所拥有的内存

linuxfellow 发表于 2015-03-18 11:53

回复 14# linuxfellow

zmq_msg_close (&zmq)文档有点含糊。这个函数只是把zmq标志为“不再使用”,并没有马上回收。在我们的循环里,如果在zmq.content被释放前马上调用zmq_msg_init (&zmq),这样就会有内存泄露。
在调用zmq_msg_init (&zmq)前要先检查并释放zmq.content

   

linuxfellow 发表于 2015-03-18 12:04

本帖最后由 linuxfellow 于 2015-03-18 12:58 编辑

会不会是个scope问题?   zmq_msg_close 释放内存,只有在变量zmq_msg不在其有效范围内时才真正释放内存。
如果把zmq_msg_t zmq_msg定义在while循环外,zmq_msg总是有效,message不会被真正地free
如果把zmq_msg_t zmq_msg定义在while循环里,zmq_msg出了有效范围,message就会被真正地free
while(1)
      {
            zmq_msg_t zmq_msg;   //把变量定义到while-loop里面就不会泄露了;这样就会保证zmq_msg_close 正确工作?
            zmq_msg_init (&zmq_msg);

            len = zmq_msg_recv (&zmq_msg, rsock, 0);
            if (len >= 0)
            {
                        zmq_msg_send (&zmq_msg, ssock, 0);
            }

            zmq_msg_close (&zmq_msg);
      }


择天记 发表于 2015-03-18 12:19

好复杂的样子

linuxfellow 发表于 2015-03-18 12:40

本帖最后由 linuxfellow 于 2015-03-18 12:56 编辑

回复 17# 择天记
不复杂
3行代码。 问题是不是自己的代码,没法编译运行,只能想想各种可能。
以前对于应用层的代码,我只告诉他们你们的application有问题,让他们自己劳神去。

昨天坛里镇水铁牛老兄说帮我瞧瞧代码,我就向应用层的同事要代码,告诉他们问题能解决。既然话说出去了,就得解决问题。 从没用过zeromq, 临时翻书,想想可能的问题。
问题还是很有趣的。

但是下次决不干这种傻事了。


   

nswcfd 发表于 2015-03-18 13:09

这是c++代码么?行为会跟scope有关系?好诡异……
回复 16# linuxfellow


   

镇水铁牛 发表于 2015-03-18 22:22

回复 16# linuxfellow
在czmq的库中,发现他们是把上面的函数经过封装的,当时不确定,问题找到就好,不过基于czmq开发比较好,还有低版本的zmq是有缺陷的。
   
页: 1 [2] 3 4
查看完整版本: application的heap一直增长,不下降