当前位置: 技术问答>linux和unix
linux下不断malloc和free
来源: 互联网 发布时间:2017-04-27
本文导语: 在linux下的开发程序,不断的malloc和free,结果内存越来越大,等到1.6G的时候程序就出现问题了(抓包处理程序),主要表现在丢包率为100%,也就是后面开始丢弃所有数据包了,请问这是什么原因?有什么处理办法没有...
在linux下的开发程序,不断的malloc和free,结果内存越来越大,等到1.6G的时候程序就出现问题了(抓包处理程序),主要表现在丢包率为100%,也就是后面开始丢弃所有数据包了,请问这是什么原因?有什么处理办法没有?
看到一篇帖子说malloc和free不断使用的话,内存是逐渐增大是正常的,但是这个结果导致我程序出现了问题,希望知道的高手指点下...谢谢!
参考【http://topic.csdn.net/u/20070904/10/8c684c51-8088-40fe-af50-80b5cd7b716d.html】
看到一篇帖子说malloc和free不断使用的话,内存是逐渐增大是正常的,但是这个结果导致我程序出现了问题,希望知道的高手指点下...谢谢!
参考【http://topic.csdn.net/u/20070904/10/8c684c51-8088-40fe-af50-80b5cd7b716d.html】
|
当用free释放的你用malloc分配的存储空间,释放的存储空间并没有从进程的地址空间中删除,而是保留在可用存储区池中,当再次用malloc时只要可用存储区池中有足够的地址空间,都不会再向内可申请内存了,而是在可用存储区池中分配了,所以如果你的free和malloc用的正确的话,应该不会存在你说的那种情况吧!
|
应该是程序出错了吧,我这儿有个服务,每个请求都会malloc和free一次,大小几k到几百k不等,处理100多万的数据了,也没有发生内存泄露的问题
|
首先确认是否是malloc频繁的问题。
如果malloc很频繁的话,建议用内存池,这样不会产生很多内存碎片,加快程序的响应速度。
如果malloc很频繁的话,建议用内存池,这样不会产生很多内存碎片,加快程序的响应速度。
|
如果发生内存泄露的话,会导致频繁磁盘交换,确实会对其他I/O造成影响
内存池提供了一种灵活的方式,其实大部分程序,用预分配就够了,你事先分配一个够大的缓冲区即可
内存池提供了一种灵活的方式,其实大部分程序,用预分配就够了,你事先分配一个够大的缓冲区即可
|
只知道频繁malloc,free会产生大量内存碎片,不知怎么影响到了你的丢包
|
既然是抓包处理程序,那么所需的内存大小应当是可以预计的。
建议采用内存池的方式管理。
可以拿网卡驱动的内存管理看看。
建议采用内存池的方式管理。
可以拿网卡驱动的内存管理看看。
|
1、不要频繁free,用realloc试试
2、内存池
2、内存池
|
内存池,自己管理咯
|
+1
也不应该使你的应用程序内容不断上升。基本上可以确定是内存泄露导致的问题,free和malloc没有对应上。