Chinaunix

标题: linux下malloc/free申请释放问题??? [打印本页]

作者: daxiguagg    时间: 2014-04-21 11:58
标题: linux下malloc/free申请释放问题???
本帖最后由 daxiguagg 于 2014-04-21 12:17 编辑
  1. malloc/free申请释放问题???
  2. 下面是模拟一个程序的执行情况。

  3. int main(int argc, char** argv) {
  4.     void *buf[2000];
  5.     int i=0,fds=2000;
  6.     for (i=0;i<fds;i++) //循环申请内存2000次,大概125MB
  7.     {
  8.         buf[i]=malloc(65536);//malloc函数分配内存,请求内存小于128K,malloc函数会调用brk系统调用,将_edata指针往高地址推
  9.         memset(buf[i],0,65536);//第一次访问已分配的虚拟地址空间的时候,发生缺页中断,系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。
  10.     }
  11.     sleep(60);  //模拟等待处理一些工作。
  12.     for (i=0;i<1999;i++)
  13.     {
  14.         free(buf[i]);//循环释放,按理说free(buf[0]);到free(buf[1998]);已经释放了大量内存,但程序依然占用125MB。是因为brk分配的内存需要等到高地址内存释放以后才能释放,也就是说,free(buf[1999])没有释放的话,之前的所有释放都没有释放。最终导致程序一直占用125M多内存一直得不到释放。
  15.     printf("%d\n",i);
  16.     }
  17.     sleep(10000);
  18.     return (EXIT_SUCCESS);
  19. }
  20. 怎样能在这种环境情况下及时的释放内存呢?
复制代码

作者: timespace    时间: 2014-04-21 12:21
回复 1# daxiguagg
如果偶尔申请大块内存,且需要及时释放,考虑mmap;如果内存分配模式简单而频繁,考虑维护一个内存池;其它情况就直接malloc/free,别做太多杞人忧天的事情。

   
作者: MMMIX    时间: 2014-04-21 16:11
timespace 发表于 2014-04-21 12:21
别做太多杞人忧天的事情。


过早优化乃99%万恶之源啊。
作者: daxiguagg    时间: 2014-04-21 18:06
只是闲来无事,发现有这个问题存在,想探讨一下看有些什么方法解决而已




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2