假设我有一个 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;
}
最佳答案
参见 Will malloc implementations return free-ed memory back to the system?寻求解释。如果您实际跟踪您的二进制文件,您会看到内存是使用 mmap() 分配的,但没有被释放,即使您调用 free() 也是如此。
要求 free() 将内存返回给进程,而不是操作系统。使用 glibc,您可以调用 malloc_trim(),但这仅适用于 sbrk() 分配的内存,如果使用 mmap() 满足分配则不行
关于linux - 另一个程序是否有可能在分配后重新使用空闲内存,然后由其他已经运行的程序释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16417702/