当前位置: 技术问答>linux和unix
网络发送数据时 进程所占内存缓慢增加,直到系统内存耗尽而killed掉,[请大家帮忙]
来源: 互联网 发布时间:2016-08-30
本文导语: 本帖最后由 ykeastronaut 于 2010-05-29 15:09:06 编辑 出了个很棘手的问题,请大家帮我看看哪里出了问题。 问题: 这几天在调arm-linux开发板上的网络通信程序,当在不断发送数据到Windows上的客户端时,该进程所占...
问题:
这几天在调arm-linux开发板上的网络通信程序,当在不断发送数据到Windows上的客户端时,该进程所占内存不断缓慢增加,由刚开始的9401kB,缓慢增加到40784KB,几乎将开发板上的可用内存全部耗尽,最后被系统的oom-killer给kill掉该进程。查找了所有可能出现内存溢出的地方,但仍然苦思得不到原因。也调用了以前的一些TCP/IP socket程序来看,仍然存在其进程所占内存不断增加的情况,只不过其增加没有现在这么快,而当时未注意到这种情况而已。
排除:
1>每次基本上都是从开发板上发送4096*4=16384Byte大小的数据包。调试时,不启动板上的发送数据操作,该进程里其他线程所占的内存都基本是一个恒定值,但当激活该发送数据操作时,该进程所占内存几乎以每次200KB的速度递增,直到被系统杀掉。
2>结合windows客户端所收到的数据所占空间大小,发觉开发板进程所增加的内存几乎就等于其传输到客户端的数据所占得内存?
仍然未查到相关的原因,不知道是不是板上内核缓冲区未将发送完的数据清除? 大家给点意见,感谢!
|
那看来就是xdr_free的问题了,我猜测Device_ReadResp这个类型有个自己的clear函数,但是你忘了调用,或者是xdr_free的调用格式错了。
|
楼主在网络通信程序中每次所要发送数据那部分程序是用共享内存的方式实现的吗?
由刚开始的9401kB,缓慢增加到40784KB,几乎将开发板上的可用内存全部耗尽
从上面看出你没有重复利用内存。
由刚开始的9401kB,缓慢增加到40784KB,几乎将开发板上的可用内存全部耗尽
从上面看出你没有重复利用内存。
|
问题很简单阿,result.data.data_val = (char *)malloc(sizeof(char*)num_bytes);
看那块free这个内存了,xdr_free应该不会负责释放吧,看参数就能看出来,传进去的是(char*)&result
看那块free这个内存了,xdr_free应该不会负责释放吧,看参数就能看出来,传进去的是(char*)&result