考虑以下 C 代码,它创建 100,000 个 4KB 大小的页面,然后释放 99,999 个页面,最后释放最后一个页面:
#include <stdio.h>
#include <stdlib.h>
#define NUM_PAGES 100000
int main() {
void *pages[NUM_PAGES];
int i;
for(i=0; i<NUM_PAGES; i++) {
pages[i] = malloc(4096);
}
printf("%d pages allocated.\n", NUM_PAGES);
getchar();
for(i=0; i<NUM_PAGES-1; i++) {
free(pages[i]);
}
printf("%d pages freed.\n", NUM_PAGES-1);
getchar();
free(pages[NUM_PAGES-1]);
printf("Last page freed.\n");
getchar();
return 0;
}
如果你编译它,运行它并监控进程的内存使用情况,你可以看到内存使用量在第一次之前达到了大约 400MB getchar
(当内存分配给 100,000 页时),然后即使在 99,999 页被 de-分配(在第二个之后getchar
),最后,当最后一页被取消分配时,它下降到 1MB。
所以,我的问题是为什么会这样?为什么只有在所有页面都被释放时才将整个内存返回给操作系统?是否有任何页面大小或任何页面对齐方式可以防止这种事情发生?我的意思是,当只有一页被释放时,是否有任何页面大小或对齐方式使任何分配的页面完全返回给操作系统?