Chinaunix

标题: linux的内存管理机制?大量malloc,大量free出现疑似泄漏。 [打印本页]

作者: tedcy    时间: 2012-12-18 18:34
标题: linux的内存管理机制?大量malloc,大量free出现疑似泄漏。
在写一个高并发的文件服务器,发现在10K并发的任务处理完毕之后,top看到依然占用了极高的内存。
但是使用valgrind并未发现泄漏。

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

  3. int main()
  4. {
  5.         char *p[1024];
  6.         int i,j;
  7.         char c;

  8.         for(i = 0;i != 1024;++i)
  9.         {
  10.                 p[i] = malloc(64*1024);
  11.                 for(j = 0;j != 64*1024;++j)
  12.                         p[i][j] = 1;//产生页错误分配实际帧
  13.         }
  14.         for(i = 0;i != 1024-1;++i)
  15.                 free(p[i]);
  16.         printf("pause,input any key\n");
  17.         scanf("%c",&c);
  18.         free(p[1024-1]);
  19.         while(1);
  20.         return 0;
  21. }
复制代码
top里面如下
25574 tedcy     20   0 69608  64m  384 S  0.0  1.8   0:00.20 pts/8    mem_test

输入一个字母以后

25574 tedcy     20   0  4056  604  392 R 99.7  0.0   0:11.66 pts/8    mem_test

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

作者: crazyhadoop    时间: 2012-12-18 18:42
是不是内存被缓存了,暂时还没有释放出去?
作者: crazyhadoop    时间: 2012-12-18 18:43
http://www.poempelfox.de/blog/20 ... the-essence-of-evil  看看这篇文章
作者: tedcy    时间: 2012-12-18 18:46
回复 2# crazyhadoop
不知道是glibc的原因还是linux的原因。用valgrind的massif查看可以看到内存是被线性释放的。而top里直观的看到就是非线性(一次性)被释放。
我尝试过不断malloc2G的内存,然后依次释放也是一样的情况,所以应该不是缓存的关系。

   
作者: folklore    时间: 2012-12-18 18:53
@tedcy
free并不一定马上调用内核的free将内存释放。
它在等你再次malloc,算是应用层的内存池
作者: tedcy    时间: 2012-12-18 18:57
@folklore
请教一下,它一般在什么情况才真正释放。
或者,这个特性可以选择性关闭吗?
作者: folklore    时间: 2012-12-18 18:59
@tedcy
自已写个free代替之
作者: tedcy    时间: 2012-12-18 19:00
回复 3# crazyhadoop
我的内核是2.6.32-279.14.1.el6.x86_64
“There is hope the kernel developers might fix or have fixed this feature already: The changelog for 2.6.30.1 lists several bugfixes for it, but the author doesn't seem to be sure to have catched them all, and asks for bugreports if problems still arise. Luckily, it will be some time before we change to a kernel >2.6.30.1, so I will not be a guinea pig again anytime soon.”
应该不是这个文中提到的原因。

   
作者: tedcy    时间: 2012-12-18 19:02
回复 7# folklore
呃,自己写free指自己实现内存池吗?


   
作者: ilogo1    时间: 2012-12-20 11:15
free()释放由malloc()申请的线性区,特别注意是回收这块线性地址区域。。通常内核会怠慢对应的实际物理内存。。。




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