我们在C语言中学习过关于动态内存申请的相关操作,例如malloc
那么在Linux中也是相同的操作:我们以32位操作相同为例
我们知道,申请动态内存实质上就是从堆区(.heap)中申请,而在4G内存分布中,系统内核已经占去了1G的空间,而剩下的3个G还需要被这些区域共享,所以实际上我们从堆区申请的最大内存可能就是2.5G左右,但是 如果我们的虚拟机开启了虚拟内存的话,实际上可申请的就会比2.5G大了,例如我们虚拟机的虚拟内存是2G,此时,我们最大可从堆区申请的空间就是约4.5个G左右了
char* p=(char*)malloc(1024*1024*1024*4.5);
此时我们申请4.5G空间会成功嘛?
答案是:没有答案。
因为这个就要和实际情况联系在一起了,理论上会成功的,但是如果在申请的过程中有其他进程也调用了系统空间,此时就会申请失败。
这里我们有一点需要注意:
请大家猜一下,例如A物理内存(2G的空间 占用5%)B虚拟内存(2G的空间占用 0%)如果我们申请2G的空间,会发生什么样子的事情呢?
A(100%)B(5%)左右
为什么会发生这样的事情呢?
虚拟内存的作用就是,当我们的物理内存不够使用的时候,会将虚拟内存拿出来一部分去共享