假设我在拥有8Gb RAM的计算机上运行Linux(64位,内核2.6,glibc 2.4)操作系统。所有引用的程序都是C实现。
程序A启动,让我们说它分配(并在里面写入信息)5 Gb的内存(做malloc)。在此之后,它没有所有预分配的内存。这意味着我们有一个曾经在内存中加载5Gb内存的进程,现在运行的内存使用率非常低。
当程序A仍在运行且没有使用内存时,我启动了同一程序的另一个实例(我称之为程序B),试图分配5Gb的内存。
我观察到的是程序B无法保留所有内存并且OS开始交换,尽管理论上它应该有足够的空闲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;
}
答案 0 :(得分:2)
有关说明,请参阅Will malloc implementations return free-ed memory back to the system?。如果您实际上使用了二进制文件,您将看到内存是使用mmap()分配的,但是即使您调用free()也不会释放。
必需的是free()将内存返回给进程,而不是操作系统。使用glibc,你可以调用malloc_trim(),但这只适用于sbrk()分配的内存,而不是使用mmap()
来满足分配答案 1 :(得分:0)
在linux中,我们使用此命令释放内存和脏缓存..
同步; echo 3&gt;的/ proc / SYS / VM / drop_caches
希望这有助于释放未使用的内存。