windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解
通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分),
内存专用工作集是程序独占的物理内存,
提交大小是程序独占的内存(包含物理内存和在页面文件中的内存).
注:页面文件就是存放不在物理内存中的内存,文件路径一般在C:\pagefile.sys,目的是为了能够让更多的进程运行,即使合起来所占用的内存已经超过物理内存. 只要将其中一部分内存转入页面文件, 物理内存就可以空出来继续运行新的进程.
它们之间的关系:
工作设置内存 = 内存专用工作集 + 与其他进程共享的物理内存.
提交大小 = 内存专用工作集 + 保存在页面文件中的独占内存.
(其中有些例外,有时候内存专用工作集可能会比提交大小大一点点,不过可以不用考虑)
工作设置内存和内存专用工作集在程序不变化情况下会变化, 系统会考虑程序活动情况,物理内存剩余量等减少或增加物理内存.
提交大小在程序不变化情况下不会变化,因为程序就是占用了那么多专用内存.
如果要测试程序占用的内存大小,建议在程序加载完毕后记录提交大小.其他的会变化建议不要记录.
还想要了解更清楚?好孩子.
下面通过代码来详细了解.
首先windows任务管理器已经不够用了,需要用Process explorer和VMMap工具.
接下来解释一些名词:
windows任务管理器中的称谓 | Process explorer中的称谓 | VMMap中的称谓 |
工作设置内存 | Working set | Total WS |
内存专用工作集 | WS Private | Private WS |
提交大小 | Private Bytes | Private |
无对应选项可显示 | Virtual Size | Size |
无对应选项可显示 | 无对应选项可显示 | Committed |
名词说明:
Virtual Size: 程序总的所使用的内存(包含共享,非共享,物理,页面,为程序保留的但未分配的内存)
Committed: Virtual Size减去为程序保留的但未分配的内存
为程序保留的但未分配的内存: 就是告诉系统我要一块内存,但暂时不用,不过分配的地址得给我,系统就给他一个不用的地址,但不分配内存,等程序申请要使用时,就从页面或物理内存中分配出来放在那个地址上.
关于页面文件和物理内存如何转换稍微讲解一下,当程序要访问某个地址, 系统发现这个地址不在物理内存里,就会产生中断,然后去读取页面文件,把页面文件中与内存相关的数据拷贝到物理内存,然后标记一下这个地址已经在物理内存中了,然后继续让程序运行.
现在来看个例子:
程序main.exe定义了一个5M的全局变量,5M的常量,并申请了一个5M的内存,程序代码大小为2M.
char g_str[5*1024*1024]; //5M的全局变量
const char STR[5*1024*1024]; //5M的常量
void main()
{
char *p = (char*) HeapAlloc(GetProcessHeap(), 0, 1024*1024*5); //申请的5M内存
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);
}
Main.exe程序调用了lib.dll
先看main.exe总的占用的内存.
Virtual Size = (5M的全局变量 + 5M的常量 + 5M的内存 + 2M的程序代码 )
+ ( 4M的全局变量 + 4M的常量 + 4M的内存 + 1M的程序代码 )
= 30M.
然后看main.exe独占的内存:
(提交大小)Private Bytes = 5M的全局变量 + 5M的内存
+ 4M的常量 + 4M的内存
=18M.
由上可以看出独占指的是只能进程自己使用, 比如代码,常量等就是共享的.
分配的内存,可变的全局或静态变量就是独占的.
至于Working set和WS Private,因为其为变化量,所以无法计算其值.
Working set物理内存变化规律:
一般情况下在分配出来内存后,物理内存只分配4K左右,等访问到超过4K的时候,会慢慢加大物理内存,等到系统总的物理内存小于一定值后,又会将不在前台的进程的物理内存减少.
如果进程想休息了, 可以调用SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1);
来将自己的一些内存从物理内存转移到页面文件.
测试环境: Win7 32位
参考:
VMMAP显示和process explorer不一样
http://superuser.com/questions/185318/process-explorer-not-showing-the-biggest-user-of-my-ram
VMMap内存详解
http://www.cnblogs.com/georgepei/archive/2012/03/07/2383548.html
作者:hgyxbll,原文链接:http://shashanzhao.com/archives/832.html
windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解相关推荐
- Windows Server中的 WINS 服务器远程内存损坏漏洞分析
本文讲的是Windows Server中的 WINS 服务器远程内存损坏漏洞分析, 漏洞概要 在2016年12月,FortiGuard Labs发现并报告了Microsoft Windows Serv ...
- 踩内存是什么意思啊_Win10任务管理器中的quot;共享GPU内存quot;是什么意思?
WIN10任务管理器中的"共享GPU内存"首次在WINDOWS任务管理器中集成. 红框内中专用GPU内存自然不用说,那是显卡带的内存也就是显存容量.因为我这台机的是GTX1060 ...
- 如何使用CMD重置Windows 10中的网络设置
在本教程中,我们将了解如何在Windows 10 中重置网络设置.如果您最近更换了ISP(互联网服务提供商),因此盒子和您的计算机无法再连接到互联网.不要惊慌!尝试重置您的网络设置,您永远不知道,您可 ...
- 在 Windows 10 中重置防火墙设置的 4 种方法
一.通过控制面板重置 Windows 防火墙 如果您是 Windows 平台的常规用户,则可能会意识到微软有一天会终止"控制面板"的可能性,因为它会将其可配置设置转移到 Windo ...
- python内存的回收机制_python的内存管理和垃圾回收机制详解
简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...
- linux内存管理机制以及free命令详解
linux内存管理机制以及free命令详解 一.linux内存管理机制 1.物理内存和虚拟内存 直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存 ...
- java中String s=abc及String s=new String(abc)详解
java中String s="abc"及String s=new String("abc")详解 1. 栈(stack)与堆(heap)都是Java用来在R ...
- 用Advanced Installer制作DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版详解
关于 DotNetBar for Windows Forms 12.0.0.1_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...
- python中的json函数_python中装饰器、内置函数、json的详解
装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...
最新文章
- 《第一行代码》学习笔记19-广播接收器Broadcast_Receiver(2)
- 每天一道LeetCode-----在有序的二维数组中查找某个元素
- Apsara Stack 技术百科 | 浅谈阿里云混合云新一代运维平台演进与实践
- Java分享笔记:自定义枚举类 使用enum关键字定义枚举类
- JVM——Java内存模型(JMM)
- tiny服务器系列,项目:TinyHTTP服务器
- html之浮动和定位
- 8.1.4 CSS3文字(1)( 文字阴影和描边、文字排版、自定义文字 )
- [转载] python的变量和C++的变量有什么区别
- ios 去掉底部状态栏,隐藏ios 9中的状态栏
- iterator总结(未完)
- playwright-python 截图、录制视频、录制接口(二)
- 酵素果冻真的能减肥吗?
- Codeforces936B. Sleepy Game
- 批量删除,未勾选数据,点击【批量删除】弹出确认删除提示框
- dvsdk_4_00_00_22_dm3730 Makefile内容
- SLAM——之G2O函数库
- Java使用付费代理的两种实现方法
- 韩松手机摄影笔记第一课---手机拍照核心功能全解
- linux pjsip 编译_pjsip linux下编译