windows资源监视器中内存项(提交、工作集、可共享、专用)的含义及区别

各字段官方解释:

  1. 提交:操作系统为进程保存的虚拟内存量;
  2. 工作集:进程当前正在使用的物理内存量;
  3. 可共享:进程当前使用的可与其他进程共享的物理内存量;
  4. 专用:进程当前使用的不能被其他进程共享的物理内存量;

对各字段的分析: 

使用下面的代码进行测试

#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封装了内存初始化的过程,在初始化过程中系统的缺页中断就会导致开辟实际的物理内存了。

发布了140 篇原创文章 · 获赞 65 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/paradox_1_0/article/details/103514361
今日推荐