免费注册 查看新帖 |

Chinaunix

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

malloc内存用free释放后系统不回收 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-21 09:56 |只看该作者 |倒序浏览
在SCO UNIX下,小弟用C语言编写的程序malloc内存使用完后,用free释放,但是系统可用内存并不增加。如原来系统可用内存为100兆,malloc内存后可用内存还剩下50兆,使用完用free释放,但是系统可用内存并未增加还是50兆(按理应该是100兆);可是程序完全退出后内存完全释放。请达人们指点迷经。万分感谢!
程序例子:
#include <stdio.h>
#include <string.h>

int main(void)
{
char *str;
/* allocate memory for string */
if ((str = malloc(102400)) == NULL)
{
printf("Not enough memory to allocate buffer\n");
exit(1); /* terminate program if out of memory */
}
strcpy(str, "Hello"); /* copy "Hello" into string */
printf("String is %s\n", str); /* display string */
sleep(10);
free(str); /* free memory */
printf("End!\n");
sleep(10);
printf("Exit!\n");
return 0;
}

论坛徽章:
0
2 [报告]
发表于 2006-04-21 10:16 |只看该作者
楼主在程序运行前后用什么观测的系统内存使用量,在这个程序里你只分配了大小为100K的字符串,是不是因为分配容量较小,通过观测软件反映不明显,你可以试着分配大一点的字符串,比如你内存容量的一半,运行程序前后观察一下,看是否有效果。

论坛徽章:
0
3 [报告]
发表于 2006-04-21 10:29 |只看该作者
在SCO 505系统下用sar -r 1 100观察。内存分配大了也一样。

论坛徽章:
0
4 [报告]
发表于 2006-04-21 10:38 |只看该作者
确实如此,不过比比担心,这里的不回收指的是process virtual space不收缩。
要想收缩,可以采用mmap来分配memory.

论坛徽章:
0
5 [报告]
发表于 2006-04-21 11:29 |只看该作者
原帖由 goattang 于 2006-4-21 09:56 发表
在SCO UNIX下,小弟用C语言编写的程序malloc内存使用完后,用free释放,但是系统可用内存并不增加。如原来系统可用内存为100兆,malloc内存后可用内存还剩下50兆,使用完用free释放,但是系统可用内存并未增加还是 ...



很正常,跟系统malloc和free的实现有关系!
当你mallco后free,虽然没有看到可用内存增加,但是当你再一次malloc后,应该也看不到可用内存减小(没有试,lz可以试试)!

论坛徽章:
0
6 [报告]
发表于 2006-04-21 15:31 |只看该作者
楼上,你说的情况属实,不过要命的是,小弟的程序使用多进程,且每次处理的数据非常大,有时可达200多兆。如果按上面情况,要是运气不好的话,有十个进程各申请一次,那就要占去2G内存,就会造成系统资源枯竭。

论坛徽章:
0
7 [报告]
发表于 2006-04-22 12:33 |只看该作者
你还是没有怎么理解malloc啊

论坛徽章:
0
8 [报告]
发表于 2006-04-22 16:52 |只看该作者
奇怪,怎么没人说虚存和物理内存这类东西的。
malloc是上层函数,毕竟分配的是虚存。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP