windows任务管理器中的内存选项
摘要:关于windows任务管理器中的内存选项的参数的含义
- 使用中(已压缩):
占有内存条的内存为4.4GB,其中293MB是被压缩过的内存。 - 可用
内存条为16GB,使用中为4.4GB,为硬件保留的为293MB,剩余内存为11.3GB。 已提交
所有程序已提交的地址为6.4GB。总的内存(物理内存+磁盘上的页面文件为16.7GB)。
VirtualAlloc分配内存有两个步骤:第一个步骤MEM_RESERVE,第二个步骤MEM_COMMIT。"已提交"就对应着"MEM_COMMIT"第二个步骤。一个进程先MEM_RESERVE在这个进程所在的虚拟地址空间里声明,xx--xxx地址我要了,实际上就相当于预订。预订过后MEM_COMMIT去使用预定的空间。需要注意的是当你没有去访问MEM_COMMIT的空间时,实际上MEM_COMMIT所占的空间并 不在内存条(物理空间)里面,有很大可能在磁盘上的页面文件中。只有MEM_COMMIT后,"提交大小"才会增加。
#include<stdio.h> #include<Windows.h> int main() { PVOID pVM = 0; //指定pvAddress为NULL,表示系统自动寻找地址,(分配粒度 64kb对齐) //dwsize根据 内存页面大小的整数倍来预订(这里预订了10240kb的地址空间) pVM=VirtualAlloc(NULL,10240*1024, MEM_RESERVE, PAGE_READWRITE); printf("预订虚拟地址空间成功!"); //预订虚拟地址空间时 "提交大小" 并不会增加 //调拨物理内存到地址空间(这里的两个参数也是 内存页面大小的整数倍) //这里调拨了5120kb的物理内存到虚拟地址空间pVM+16kb的位置,其余位置不能访问(访问违规) VirtualAlloc((PVOID)((PBYTE)pVM+16*1024 ),5120*1024, MEM_COMMIT, PAGE_READWRITE); printf("调拨虚拟地址空间成功\n"); //只有commit所预订的虚拟地址空间,"提交大小" 才会增加 /* { char * p = (char *)pVM; sprintf(p, "%s", "xx"); printf("%s", p);//访问违规 } */ char * p = (char *)pVM + 16 * 1024; sprintf(p, "%s", "正在向空间写入"); //只有对空间进行操作的时候比如写入,commit的虚拟地址空间才会进入真正的内存条中。 //dwSize位0,系统会自动识别 区域大小, //如果pvAddress在一个页面中间,pvAddress+dwSize也在页面中间,那么会释放所有覆盖的页面(基于页面粒度) //VirtualFree(pVM, 0, MEM_FREE); while (1); return 0; }
- 已缓存
因为内存条只用了4.4GB,剩下的11.3GB空闲着是不是浪费,就拿这11.3GB中的8.9GB去当成缓存用来。这8.9GB内存可以被清空为新的程序腾空间。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。