首先我们有两个问题
malloc()
申请1G的内存能否成功?判断依据是什么?- 申请了一块空间没有
free
,进程就结束了,那么空间被回收了吗?
我们写一段代码来申请1G空间试一试
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>int main()
{char *s = (char*)malloc(1024*1024*1024);assert(s! NULL);printf("main over\n");exit(0);
}
这是我们执行程序前的资源情况
这是运行程序后
我们发现好像并没有太大的区别产生,这是因为我们申请内存后会在虚拟内存上进行划分,但是只有在真的使用这块空间的时候才会真正在分配物理内存
我们将代码进行修改
memset(s,0,1024*1024*1024);
我们添加这样一段代码,让我们申请到的空间进行清零
再次执行
内存占用增加,随后程序结束,内存释放 (运行过程中,需要对不用的空间进行free,而程序结束会自动将占用的内存释放)
如果我们申请超过内存大小的空间呢
假如我们内存空间不够用了,系统会将一部分不用内容存放在虚拟内存上,但是当程序结束后,外存上存储的一部分依旧还在,为什么程序结束不把那一部分调回来呢?系统在使用这部分内容时候才会将将其调回来,否则系统是不会随便操作的,防止内存空间再次不足
swapoff -a
停止虚拟内存交换空间命令
如果我们停掉虚拟内存,再去使用程序去申请大于内存的空间,这时会直接运行失败