免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2536 | 回复: 9
打印 上一主题 下一主题

[其他] linux的内存管理机制?大量malloc,大量free出现疑似泄漏。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-18 18:34 |只看该作者 |倒序浏览
在写一个高并发的文件服务器,发现在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是如何工作的?

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2012-12-18 18:42 |只看该作者
是不是内存被缓存了,暂时还没有释放出去?

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
3 [报告]
发表于 2012-12-18 18:43 |只看该作者

论坛徽章:
0
4 [报告]
发表于 2012-12-18 18:46 |只看该作者
回复 2# crazyhadoop
不知道是glibc的原因还是linux的原因。用valgrind的massif查看可以看到内存是被线性释放的。而top里直观的看到就是非线性(一次性)被释放。
我尝试过不断malloc2G的内存,然后依次释放也是一样的情况,所以应该不是缓存的关系。

   

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2012-12-18 18:53 |只看该作者
@tedcy
free并不一定马上调用内核的free将内存释放。
它在等你再次malloc,算是应用层的内存池

论坛徽章:
0
6 [报告]
发表于 2012-12-18 18:57 |只看该作者
@folklore
请教一下,它一般在什么情况才真正释放。
或者,这个特性可以选择性关闭吗?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
7 [报告]
发表于 2012-12-18 18:59 |只看该作者
@tedcy
自已写个free代替之

论坛徽章:
0
8 [报告]
发表于 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.”
应该不是这个文中提到的原因。

   

论坛徽章:
0
9 [报告]
发表于 2012-12-18 19:02 |只看该作者
回复 7# folklore
呃,自己写free指自己实现内存池吗?


   

论坛徽章:
0
10 [报告]
发表于 2012-12-20 11:15 |只看该作者
free()释放由malloc()申请的线性区,特别注意是回收这块线性地址区域。。通常内核会怠慢对应的实际物理内存。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP