Chinaunix
标题:
内存释放问题
[打印本页]
作者:
airhello
时间:
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内存。
#include <stdio.h>
#include <signal.h>
struct memnode
{
struct memnode *next;
unsigned char *buf;
unsigned int buf_len;
};
unsigned char tag = 1;
void sig_55(void)
{
if(tag)
tag = 0;
else
tag = 1;
}
int main(int argc, char *argv[])
{
struct memnode *head = NULL, *p = NULL;
int size = 0;
unsigned int malloc_num = 0;
unsigned int free_num = 0;
if(argc != 2){
printf("input error!\n");
exit(-1);
}
size = atoi(argv[1]);
signal(55, &sig_55);
printf("MemUnitSize: %d\n", size);
while(1){
if(tag){
if(malloc_num > 1024*1024){
sleep(1);
continue;
}
p = (struct memnode *)malloc(sizeof(struct memnode));
if(NULL == p){
exit(-1);
}
p->buf = (unsigned char *)malloc(size*sizeof(unsigned char));
if(NULL == p->buf){
exit(-1);
}
p->next = head;
head = p;
malloc_num++;
}
else{
p = head;
if(p == NULL){
sleep(1);
continue;
}
while(p){
head = p->next;
free(p->buf);
free(p);
free_num++;
p = head;
}
printf("malloc_num: %d, free_num: %d\n", malloc_num, free_num);
}
}
exit(0);
}
复制代码
作者:
rain_fish
时间:
2010-03-27 10:43
代码?
作者:
greensnow
时间:
2010-03-27 10:44
是这样的,你用mallinfo可以看到那部分内存被系统保留了。。
作者:
JCheung
时间:
2010-03-27 12:11
你是不是有野指针了?
还有你的p????是从何而来的?
作者:
bluewaterray
时间:
2010-03-27 12:16
看看这个,是否有帮助
http://hi.baidu.com/shengit/blog ... 1f3f1b6227983a.html
作者:
lengyuex
时间:
2010-03-27 12:29
我认为你看top的时候内存会慢慢下降。
作者:
doofy
时间:
2010-03-27 14:27
测试了下,现象如下:
1. 如果每次1k,malloc 1000000次,内存不能及时清理,且响应信号的时间比较长,大概有5-6s的样子;
2. 如果每次1M,malloc1000次,内存迅速就释放了
1000000个1k,内存成什么样子了....
作者:
airhello
时间:
2010-03-27 14:50
回复
6#
lengyuex
我上午10点开始跑,到现在14:50了,top一直显示内存占用1033m
作者:
airhello
时间:
2010-03-27 14:57
回复
7#
doofy
呵呵,本来也不会写这种测试代码。只是项目中的一个网络数据包处理程序在运行一段时间后,占用内存不断增长,就算停止网络流量后也降不了。
最后发现,这个程序malloc/free特别多,所以就写了一个这样的测试程序。
但linux的malloc/free无法处理这么大量的内存分配和释放吗??
作者:
airhello
时间:
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()申请的内存,不能动态调整一下。
作者:
greensnow
时间:
2010-03-27 18:45
sbrk申请的内存是可以释放的,用负值调用sbrk就行,
malloc出于性能的考虑,对小块内存它选择保留下来下次再用
如果项目有这种需要,应该用内存池而不是直接调用malloc,比如glibc的obstacks
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2