摘要:关于windows任务管理器中的内存选项的参数的含义

windows任务管理器中的内存选项1

  • 使用中(已压缩):
    占有内存条的内存为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内存可以被清空为新的程序腾空间。