tedcy 发表于 2012-12-18 17:26

linux的内存管理机制?大量malloc,大量free出现疑似泄漏。

在写一个高并发的文件服务器,发现在10K并发的任务处理完毕之后,top看到依然占用了极高的内存。
但是使用valgrind并未发现泄漏。

于是写了这样一个测试程序
#include <stdlib.h>
#include <stdio.h>

int main()
{
      char *p;
      int i,j;
      char c;

      for(i = 0;i != 1024;++i)
      {
                p = malloc(64*1024);
                for(j = 0;j != 64*1024;++j)
                        p = 1;//产生页错误分配实际帧
      }
      for(i = 0;i != 1024-1;++i)
                free(p);
      printf("pause,input any key\n");
      scanf("%c",&c);
      free(p);
      while(1);
      return 0;
}top里面如下
25574 tedcy   20   0 6960864m384 S0.01.8   0:00.20 pts/8    mem_test

输入一个字母以后

25574 tedcy   20   04056604392 R 99.70.0   0:11.66 pts/8    mem_test

可以看到在最后一个元素free以后,内存占用从64M降为604
很是疑惑不解。free是如何工作的?

fifodct 发表于 2012-12-23 23:51

我觉得是kernel没有得到空闲的周期去处理memory的回收任务。

改成这样试试。
for(i = 0;i != 1024-1;++i)
{
                free(p);
                usleep(1000);
}

fayewangfans 发表于 2012-12-24 02:31

你都不验证内存分配成功不成功?
还有,malloc实现方式好想是调用系统调用sys_brk据说也有用mmap的(我不确定),不知道记错了名字没有,这个系统调用可以缩小或者扩大空间,而malloc就是管理他分配的内存,但是free的时候不见得会马上掉用sys_brk缩小空间,可能暂时的保存已经分配好的空间,下次要在调用malloc的话,就可以直接分配,而不用调用sys_brk,所以会出现上述现象。
上面的回答,可能用词不准确,我没记住那些专业词语,大概就是这个意思。

fayewangfans 发表于 2012-12-24 02:37

顺便问一句,你们需要招人吗?大四快毕业了,求带走。
页: [1]
查看完整版本: linux的内存管理机制?大量malloc,大量free出现疑似泄漏。