linux 小块内存的释放问题

我是蓝先生 2013-07-16 10:59:02
大家好。在我的虚拟机上(FC14),有一个很奇怪的现象,貌似和linux的内存回收机制相关,想请教一下。

问题是这样的:
我定义了一个结构体,接着定义了一个很大的结构体指针数组,循环malloc分配内存后休眠5秒,最后循环释放内存。

嗯,过程就是这样,但在程序还没退出的时候用top命令查看该进程的内存占用情况时,命名已经释放完所有内存了,但是RES段的值依然没有消下去,这是为什么呢?附源码:
#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MAX_ARRAY_SIZE 170000

struct MyBase
{
void * pUserData;
char pArray[56];
};

void DoTest()
{
printf("sizeof(MyBase):%d\n", sizeof(struct MyBase));

struct MyBase * pContacts[MAX_ARRAY_SIZE];
memset(pContacts, 0, sizeof(pContacts));

/* 循环分配内存 */
int i;
for (i = 0; i < MAX_ARRAY_SIZE; ++i)
{
pContacts[i] = malloc(sizeof(struct MyBase));
}

/* 此时用top命令查看,可以查看进程的内存占用情况 */
printf("DoTest:sleeping...\n");
sleep(5);

/* 循环释放内存 */
for (i = 0; i < MAX_ARRAY_SIZE; ++i)
{
if (pContacts[i] != NULL)
{
free(pContacts[i]);
pContacts[i]= NULL;
}
}
}

int main()
{
while(1)
{
printf("calling DoTest()...\n");
DoTest();
printf("end of calling DoTest()...\n");

/* DoTest里已经把内存都释放了,但用top命令查看,为什么程序所占的内存依然没有减少? */
sleep(5);
}

return 0;
}


在main函数休眠的过程中,输入top命令查看进程占用情况,很明显RES段是没有消下去的。但是也没有内存泄露,这是什么原理呢?

注意:如果把
char   pArray[56];
改成
char   pArray[57];

那么在DoTest执行完后,用top查看,看到程序占用的内存是可以消下去的。
...全文
179 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
我是蓝先生 2013-07-29
  • 打赏
  • 举报
回复
原因找到了,结贴。 内存泄漏算不上,主要是glibc内部对申请和释放的内存做了管理,有些内存需要触发一定的条件才会还给操作系统,个人认为,所有linux程序员都应该知道这个知识点。 想详细了解的同学请仔细阅读下面这篇文章。 http://www.cnblogs.com/lookof/archive/2013/03/26/2981768.html
www_adintr_com 2013-07-17
  • 打赏
  • 举报
回复
引用 4 楼 blue_tears 的回复:
[quote=引用 1 楼 adlay 的回复:] 虚拟内存降下去了没有? 如果虚拟内存已经降下去了, 那可能就和内核的内存管理算法有关系了. 试试把 sleep 加长一点, 运行下其它需要内存的进程试试看会不会有变化.
虚拟内存和实际内存都没降,但是即使反复调用DoTest函数,内存也没涨,看着和内存泄漏没关系,只是不知道为什么会这样[/quote] 泄露是没有. 如果是这样的话那应该是用户层的堆管理器在持有这块内存, 没有归还给系统. 改成 57 就好了可能和它使用的算法有关系了.
我是蓝先生 2013-07-17
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
虚拟内存降下去了没有? 如果虚拟内存已经降下去了, 那可能就和内核的内存管理算法有关系了. 试试把 sleep 加长一点, 运行下其它需要内存的进程试试看会不会有变化.
虚拟内存和实际内存都没降,但是即使反复调用DoTest函数,内存也没涨,看着和内存泄漏没关系,只是不知道为什么会这样
zqwfd 2013-07-16
  • 打赏
  • 举报
回复
char[56]改为char【57】就好了?
www_adintr_com 2013-07-16
  • 打赏
  • 举报
回复
虚拟内存降下去了没有? 如果虚拟内存已经降下去了, 那可能就和内核的内存管理算法有关系了. 试试把 sleep 加长一点, 运行下其它需要内存的进程试试看会不会有变化.

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧