解释了这些终于可以回过头来看看关于windows内存常常提及的几个指标了: Working Set:“Working Set is the current size, in bytes, of the Working Set of this process. The Working Set is the set of memory pages touched recently by the threads in the process. If free memory in the computer is above a threshold, pages are left in the Working Set of a process even if they are not in use. When free memory falls below a threshold, pages are trimmed from Working Sets. If they are needed they will then be soft-faulted back into the Working Set before leaving main memory.”此为官方解释,实际上该指标记录了所有映射到进程虚拟地址空间的物理内存RAM的大小(即:Task Manager中的Mem Usage),它不仅仅是用户方式分区部分的映射,而是整个进程地址空间的映射。即它同时包括内核方式分区中映射到RAM的部分。在用户方式分区部分只有在进程提交的页面被访问时才将相应的页面加载到主存中,而对于该部分的大小总是系统页面大小的整数倍。随着进程的不断运行,影响“Working Set”的因素包括:(1) 机器可用主存的大小 (2) 进程本身“Working Set”的大小范围。当机器的可用主存小于一定值(阙值)时,系统会释放一些老的最近没有被访问的页面,把这些页面通过交换文件交换到机器的虚拟内存中;当Working Set的大小大于该进程所设置的最大值时,同样会把一些老的页面交换到机器的虚拟内存中。当这些页面下次再被访问时,它们才加载到主存。 Private Bytes:“Private Bytes is the current size, in bytes, of memory that this process has allocated that cannot be shared with other processes.”该指标记录了进程用户方式分区地址空间中已提交的总的空间大小。无论是直接调用API申请的内存,被Heap Manager申请的内存,或者是CLR 的managed heap,都算在里面。 Virtual Bytes:“Virtual Bytes is the current size, in bytes, of the virtual address space the process is using. Use of virtual address space does not necessarily imply corresponding use of either disk or main memory pages. Virtual space is finite, and the process can limit its ability to load libraries.”该指标记录了当前进程申请成功的其虚拟地址空间的总的空间大小,包括DLL/EXE占用的地址和通过VirtualAlloc API Reserve(即不管有没有commit)的Memory Space数量。 补充一点:如两个进程都需要同一个DLL的支持,所以在进程运行过程中,这个DLL被映射到了两个进程的地址空间中,如果这个DLL的大小为4K,在两个进程中都要提交4K的虚拟地址空间来映射这个DLL。当第一个进程访问了这个DLL时,这个DLL被加载到机器主存中,这时,第二个进程也要访问该DLL,这时,系统就不会再加载一遍该DLL了,因为这个DLL已经在主存中了。当然上面所说的访问仅仅是读取的操作,如果这时候某个进程要修改DLL对应这段地址中的某个单元时,这时,系统必须为第二个进程分配另外的新页面,并把要修改位置对应的页面拷贝的这个新页面,同时,第二个进程中的这个DLL被映射到这个新页面上,这就是传说中的写时拷贝(Copy on Write)。
其实光是定义了、解释了这些概念,还是弄不清楚他们分别是对进程运行时哪些具体状态的写照、到底什么指标能够更准确的描述进程内存状况。
•Private Bytes are what your app has actually allocated, but include pagefile usage;
•Working Set is the non-paged Private Bytes plus memory-mapped files;
•Virtual Bytes are the Working Set plus paged Private Bytes and standby list.