各字段官方解释:
- 提交:操作系统为进程保存的虚拟内存量;
- 工作集:进程当前正在使用的物理内存量;
- 可共享:进程当前使用的可与其他进程共享的物理内存量;
- 专用:进程当前使用的不能被其他进程共享的物理内存量;
对各字段的分析:
使用下面的代码进行测试
#include<windows.h>
#define UNIT_SIZE (1024 * 1024)
int main(int argc, char* argv[])
{
PVOID bookMem = (PVOID)VirtualAlloc(NULL, 64 * UNIT_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
ZeroMemory(bookMem, 64 * UNIT_SIZE);
HANDLE heap = HeapCreate(0, 64 * UNIT_SIZE, 1024 * UNIT_SIZE);
PVOID heapMem = HeapAlloc(heap, HEAP_ZERO_MEMORY, 32 * UNIT_SIZE);
char* p = (char *)malloc(64 * UNIT_SIZE);
HeapFree(heap, 0, heapMem);
HeapDestroy(heap);
free(p);
return 0;
}
首先时VirtualAlloc(...)函数使用MEM_REVERSE | MEM_COMMIT标志同时预定和调拨64MB的物理内存,但是注意,这里调拨的内存是从系统页交换文件进行调拨的,属于保存的虚拟内存,因此这个时候"提交"项的值会增长大概64MB左右。当进程真正使用这段内存的时候系统才会为其分配真正的物理内存,所以执行完ZeroMemory函数后其他三项的值才会增长,另外这里有一个关系是:工作集 = 可共享 + 专用。
VirtualAlloc、HeapAlloc、malloc和new的调用关系如下所示:
malloc和new都是c运行库中的函数, 当c库被加载进进程地址空间后会首先调用HeapCreate函数创建自建堆,malloc函数和new的调用底层调用了HeapAlloc,但是HeapAlloc也是在页交换文件中进行物理内存的调拨的,为什么malloc函数和new开辟内存的时候工作集的值会增加呢?这是因为malloc函数和new封装了内存初始化的过程,在初始化过程中系统的缺页中断就会导致开辟实际的物理内存了。