Windows内存之任务管理器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012138730/article/details/90055485

最近在看内存方面的知识,打算写一系列的博客分享记录一下。

本文介绍任务管理器里各个内存项的含义以及用一个例子也解释独占性。

目录

内存项含义

1.工作集Working Set(内存) = 内存(专用工作集)+ 内存(共享工作集)

2.提交大小 Comitted Memory

内存的独占性


内存项含义

打开任务管理--详细信息---右键 选择列,选择下面这4个。

 

1.工作集Working Set(内存) = 内存(专用工作集)+ 内存(共享工作集)

工作集表示进程此时所占用的总物理内存(即占用RAM内存)。这个值是由两部分组成专用工作集 和 共享工作集。其中 专用工作集内存 是此进程独占的物理内存,共享工作集内存是指这个进程与其它进程共享的物理内存,比如加载了某一个dll所占用的内存。

 

2.提交大小 Comitted Memory

是程序独占的内存。这个值也是包含两部分,一部分是独占的理内存(即专用工作集内存),另一部分是分页文件中的独占内存映射。分页文件是硬盘中的虚拟内存,当RAM物理内存资源紧张,或者有数据长时间未使用时,操作系统通常会将数据占用的物理内存先映射到页面文件(pagefile.sys)中,并拷贝数据到硬盘中,然后将本来占用的RAM空间释放。这个也就是虚拟内存技术。

下面是一个Windows API,功能是向操作系统发送请求, 将此进程的不常用的内容从物理内存中换出到分页文件中保存

EmptyWorkingSet


内存的独占性

来自 https://www.bbsmax.com/A/KE5QEZYL5L/

下面通过一个网上的例子分析一下代码中运行起来以后哪些是独占的,哪些是共享的。

有如下的main.exe,其中call_lib()调用的是lib.dll,main.exe代码如下:

(main.exe 定义了一个5M的全局变量,一个5M的常量,并申请了一个5M的内存。程序代码本身大小为2M。)

char g_str[5*1024*1024];
const char STR[5*1024*1024];
void main()
{
    char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*5);
    call_lib();
}

其中lib.dll的代码如下:(定义了一个4M的全局变量,一个4M的常量,并申请了一个4M的内存。程序代码本身大小为1M。)

char g_str[4*1024*1024];
const char STR[4*1024*1024];
void call_lib()
{
    char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*4);
}

上述申请的内存中:

1.全局变量(静态区),alloc(堆区)的内存是该进程独占的,别的进程不可以共享。

2.常量(常量区),程序代码(代码区)的内存是这个程序的所有进程共享的,只读的。

 

所以这个main.exe运行以后,这个进程占用的总内存为(包括独占内存和共享内存):

Virtual Size = 5M的全局变量 + 5M的常量 + 5M的内存 + 2M的程序代码+ 4M的全局变量 + 4M的常量 + 4M的内存 + 1M的程序代码= 30M.

而这个进程独占的内存为(包括独占的理内存 和 分页文件中的独占内存映射):

Private Bytes = 5M的全局变量 + 5M的内存+ 4M的常量 + 4M的内存=18M.

展开阅读全文

没有更多推荐了,返回首页