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);
molloc函数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封装了内存初始化的过程,在初始化过程中系统的缺页中断就会导致开辟实际的物理内存了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论