免费注册 查看新帖 |

Chinaunix

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

内存释放问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-27 10:20 |只看该作者 |倒序浏览
本帖最后由 airhello 于 2010-03-27 11:01 编辑

写了一个小程序,不断地申请内存,每次申请1024字节,一直申请到1G,也就是申请1024*1024次。
申请完后,过一会,我就把这些内存全部释放了,但从ps aux或top来看,内存占用量还是1G多,一直不下降。

我知道,内存申请后,free时不一定真正释放。但这大的内存free后,还一直不降,很是不理解。

附上代码。只是为了测试内存而写,用信号来控制申请与释放。执行命令:./test size,其中size为分配给buf的大小。运行后,kill -55 pid来free内存。
  1. #include <stdio.h>
  2. #include <signal.h>

  3. struct memnode
  4. {
  5.         struct memnode *next;
  6.         unsigned char *buf;
  7.         unsigned int buf_len;
  8. };

  9. unsigned char tag = 1;

  10. void sig_55(void)
  11. {
  12.         if(tag)
  13.                 tag = 0;
  14.         else
  15.                 tag = 1;
  16. }

  17. int main(int argc, char *argv[])
  18. {
  19.         struct memnode *head = NULL, *p = NULL;
  20.         int size = 0;
  21.         unsigned int malloc_num = 0;
  22.         unsigned int free_num = 0;

  23.         if(argc != 2){
  24.                 printf("input error!\n");
  25.                 exit(-1);
  26.         }

  27.         size = atoi(argv[1]);

  28.         signal(55, &sig_55);

  29.         printf("MemUnitSize: %d\n", size);

  30.         while(1){
  31.                 if(tag){
  32.                         if(malloc_num > 1024*1024){
  33.                                 sleep(1);
  34.                                 continue;
  35.                         }

  36.                         p = (struct memnode *)malloc(sizeof(struct memnode));
  37.                         if(NULL == p){
  38.                                 exit(-1);
  39.                         }

  40.                         p->buf = (unsigned char *)malloc(size*sizeof(unsigned char));
  41.                         if(NULL == p->buf){
  42.                                 exit(-1);
  43.                         }

  44.                         p->next = head;
  45.                         head = p;
  46.                         malloc_num++;
  47.                 }
  48.                 else{
  49.                         p = head;
  50.                         if(p == NULL){
  51.                                 sleep(1);
  52.                                 continue;
  53.                         }

  54.                         while(p){
  55.                                 head = p->next;
  56.                                 free(p->buf);
  57.                                 free(p);
  58.                                 free_num++;
  59.                                 p = head;
  60.                         }
  61.                         printf("malloc_num: %d, free_num: %d\n", malloc_num, free_num);
  62.                 }
  63.         }

  64.         exit(0);
  65. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-03-27 10:43 |只看该作者
代码?

论坛徽章:
0
3 [报告]
发表于 2010-03-27 10:44 |只看该作者
是这样的,你用mallinfo可以看到那部分内存被系统保留了。。

论坛徽章:
0
4 [报告]
发表于 2010-03-27 12:11 |只看该作者
你是不是有野指针了?
还有你的p????是从何而来的?

论坛徽章:
0
5 [报告]
发表于 2010-03-27 12:16 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2010-03-27 12:29 |只看该作者
我认为你看top的时候内存会慢慢下降。

论坛徽章:
0
7 [报告]
发表于 2010-03-27 14:27 |只看该作者
测试了下,现象如下:
1. 如果每次1k,malloc 1000000次,内存不能及时清理,且响应信号的时间比较长,大概有5-6s的样子;
2. 如果每次1M,malloc1000次,内存迅速就释放了

1000000个1k,内存成什么样子了....

论坛徽章:
0
8 [报告]
发表于 2010-03-27 14:50 |只看该作者
回复 6# lengyuex

我上午10点开始跑,到现在14:50了,top一直显示内存占用1033m

论坛徽章:
0
9 [报告]
发表于 2010-03-27 14:57 |只看该作者
回复 7# doofy

呵呵,本来也不会写这种测试代码。只是项目中的一个网络数据包处理程序在运行一段时间后,占用内存不断增长,就算停止网络流量后也降不了。
最后发现,这个程序malloc/free特别多,所以就写了一个这样的测试程序。

但linux的malloc/free无法处理这么大量的内存分配和释放吗??

论坛徽章:
0
10 [报告]
发表于 2010-03-27 16:47 |只看该作者
回复 3# greensnow

呵呵,谢谢提醒。

用mallinfo查看了一下内存情况,结果发现,同样malloc 1G内存,
如果是每次malloc 1k,总共malloc 1024*1024次,发现malloc从操作系统获取内存的方式是sbrk()。
如果是每次malloc 1m,总共malloc 1024次,发现malloc从操作系统获取内存的方式是mmap。

网上的一些资料说,通过sbrk()申请的内存,在free之后,是不会还给操作系统的,而是加到total heap中。而mmap则可以。

问题好像又进了一步了。

但不明白的是,为什么sbrk()申请的内存,不能动态调整一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP