0

假设我有一个 Linux(64 位,内核 2.6,glibc 2.4)操作系统,运行在具有 8Gb RAM 的机器上。所有引用的程序都是 C 实现。

程序 A 启动,假设它分配(并在其中写入信息)5 Gb 内存(执行 malloc)。在此之后,它会释放所有预分配的内存。这意味着我们有一个进程曾经使用加载到内存中的 5Gb 内存,现在正在以非常低的内存使用率运行。

当程序 A 仍在运行并且没有使用内存时,我启动了同一程序的另一个实例(我称之为程序 B),试图分配 5Gb 的内存。

我观察到的是程序 B 无法保留所有内存并且操作系统开始交换,尽管理论上它应该有足够的空闲 RAM。结论是程序 A 保留了 5 Gb 的空闲 RAM 以供自己将来使用,并且不能用于任何其他程序。

从操作系统或任何其他需要分配大量内存的程序的角度来看,程序释放的内存会发生什么?有没有办法在不停止程序 A 的情况下强制操作系统释放此内存?

对不起,过于简单化了。

提前致谢!

PS:使用的代码与此类似:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(int argc, char** argv) {
    int max = -1;
    int mb,x = 0;
    char* buffer[1000];

    if(argc > 1)
        max = atoi(argv[1]);

    while((buffer[mb]=malloc(50*1024*1024)) != NULL && mb != max) {
        memset(buffer[mb], 0, 50*1024*1024);
        mb++;
        printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
        sleep(1);
        if((mb%15)==0)
    {
        for(x=0;x<5;x++)
        {   
        mb--;
                free(buffer[mb]);
            printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
            sleep(2);
        }
    }
    }

    return 0;
}
4

2 回答 2

2

请参阅malloc 实现会将释放的内存返回给系统吗?解释一下。如果你真的 strace 你的二进制文件,你会看到内存是使用 mmap() 分配的,但没有释放,即使你调用 free()。

需要的是 free() 将内存归还给进程,而不是操作系统。使用 glibc,您可以调用 malloc_trim(),但这仅适用于 sbrk() 分配的内存,而不是使用 mmap() 满足分配的情况

于 2013-05-16T12:45:47.383 回答
0

在 linux 中,我们使用这个命令来释放内存和脏缓存。

同步; 回声 3 > /proc/sys/vm/drop_caches

希望这将有助于释放未使用的内存。

于 2013-05-07T11:58:20.430 回答