- 论坛徽章:
- 0
|
本帖最后由 licaduo 于 2010-12-05 00:45 编辑
我最近在Ubuntu下做了一个c++程序,遇到一个内存释放的问题,纠结了一周了,实在搞不清楚,请高人指点下小弟。
我这边开发的程序处理流程大概如下: 程序是多线程架构,主线程负责网络接收,收到网络包之后,new一块内存存放这个数据包,把指针放入接收队列,业务处理线程从接收队列读取数据包,处理完后new一片内存存放需要发送的数据包,把刚才的数据包指针放入发送队列,然后释放刚才读取的接收数据包的指针。发送线程从发送队列中读取数据包,发送出去,释放发送数据包指针的内存。
现在的问题是:在并发压力不大的时候,从top的结果看,进程的内存占用很正常,在处理请求包的时候占用内存增长,数据包处理完之后,占用的内存回到一个比较低的水平。但是在突发的压力比较大的时候,进程的内存占用增长,但是在系统压力回落到比较小的水平的时候,内存占用不下降,这样慢慢的进程占用的内存不断上涨。现在差不多进程运行一天内存涨150m,基本上3,4天我重启一次进程。我用Valgrind检测过程序没有内存泄露。另外我放入队列的数据结构中用到了string。
我开始使用的队列使用标准库的 queue实现,后来改成list实现,但是这个问题似乎没有什么改进。
这两天从网上搜索了相关的问题,我怀疑我遇到的问题是不是与glibc的内存释放机制有关系。 之前同样的线程模型,在suse上运行似乎没什么问题,不过之前在suse上运行的程序中放入队列的数据结构中没有用到string,都是基本的int和char数组。这个问题纠结了一周了,实在搞不清楚为什么,代码上似乎没有什么明显的问题。 |
|