伤心的笔 发表于 2015-5-9 08:53:35

windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解

作者:hgyxbll,原文链接:http://shashanzhao.com/archives/832.html

虽然是中文字,但是理解起来还是很困难,什么叫工作设置内存,什么叫内存专用工作集,什么叫提交大小,区别是什么,让人看了一头雾水.

通俗的讲工作设置内存是程序占用的物理内存(包含与其他程序共享的一部分), 内存专用工作集是程序独占的物理内存, 提交大小是程序独占的内存(包含物理内存和在页面文件中的内存).
注:页面文件就是存放不在物理内存中的内存,文件路径一般在C:\pagefile.sys,目的是为了能够让更多的进程运行,即使合起来所占用的内存已经超过物理内存. 只要将其中一部分内存转入页面文件, 物理内存就可以空出来继续运行新的进程.
它们之间的关系:
工作设置内存 = 内存专用工作集 + 与其他进程共享的物理内存.
提交大小 = 内存专用工作集 + 保存在页面文件中的独占内存.
(其中有些例外,有时候内存专用工作集可能会比提交大小大一点点,不过可以不用考虑)

工作设置内存和内存专用工作集在程序不变化情况下会变化, 系统会考虑程序活动情况,物理内存剩余量等减少或增加物理内存.
提交大小在程序不变化情况下不会变化,因为程序就是占用了那么多专用内存.
如果要测试程序占用的内存大小,建议在程序加载完毕后记录提交大小.其他的会变化建议不要记录.

还想要了解更清楚?好孩子.
下面通过代码来详细了解.
首先windows任务管理器已经不够用了,需要用Process explorer和VMMap工具.
接下来解释一些名词:

windows任务管理器中的称谓Process explorer中的称谓VMMap中的称谓
工作设置内存Working setTotal WS
内存专用工作集WS PrivatePrivate WS
提交大小Private BytesPrivate
无对应选项可显示Virtual SizeSize
无对应选项可显示无对应选项可显示Committed


名词说明:
Virtual Size: 程序总的所使用的内存(包含共享,非共享,物理,页面,为程序保留的但未分配的内存)
Committed: Virtual Size减去为程序保留的但未分配的内存
为程序保留的但未分配的内存: 就是告诉系统我要一块内存,但暂时不用,不过分配的地址得给我,系统就给他一个不用的地址,但不分配内存,等程序申请要使用时,就从页面或物理内存中分配出来放在那个地址上.

关于页面文件和物理内存如何转换稍微讲解一下,当程序要访问某个地址, 系统发现这个地址不在物理内存里,就会产生中断,然后去读取页面文件,把页面文件中与内存相关的数据拷贝到物理内存,然后标记一下这个地址已经在物理内存中了,然后继续让程序运行.


IsaacZ 发表于 2015-5-9 23:04:29

不明觉厉!

伤心的笔 发表于 2015-5-10 09:39:39

IsaacZ 发表于 2015-5-9 23:04
不明觉厉!

WinXP下任务管理器的“内存大小”“虚拟内存大小”都是不准确的,而且看软件真正占用的内存应该看“提交大小(Private,XP中错译为虚拟内存大小)”,这差不多就是本文的意思。

IsaacZ 发表于 2015-5-10 10:59:35

如果有几个常用软件的实例来说明一下,就更直观些了。

伤心的笔 发表于 2015-5-10 13:15:11

IsaacZ 发表于 2015-5-10 10:59
如果有几个常用软件的实例来说明一下,就更直观些了。

这个和哪个软件没关系吧?

IsaacZ 发表于 2015-5-10 16:12:11

我看文章中说的都是“程序”所占的内存,所以认为不同的程序对于内存的占用比例是不同的。

伤心的笔 发表于 2015-5-10 18:56:33

IsaacZ 发表于 2015-5-10 16:12
我看文章中说的都是“程序”所占的内存,所以认为不同的程序对于内存的占用比例是不同的。

当然不一样。程序占用内存,是因为程序需要变量来存储数据。不同的程序需要处理的数据有多有少,占用的内存的大小也不一样。

IsaacZ 发表于 2015-5-10 22:19:23

伤心的笔 发表于 2015-5-10 18:56
当然不一样。程序占用内存,是因为程序需要变量来存储数据。不同的程序需要处理的数据有多有少,占用的内 ...

因此才希望利用具体的程序来演示这其中的差异,这样像我这样的门外汉就能比较好懂一些了。

伤心的笔 发表于 2015-5-11 19:28:14

本帖最后由 伤心的笔 于 2015-5-11 19:30 编辑

IsaacZ 发表于 2015-5-10 22:19
因此才希望利用具体的程序来演示这其中的差异,这样像我这样的门外汉就能比较好懂一些了。
恐怕这个无法用“具体的程序”来说明。
我说一下我的理解:
某个程序A,调用了一个共享组件C,这个C之前已经占了一定的内存,假设占X兆字节,该程序调用C,就可以通过C间接地访问C占用的内存,C占用的内存里面可能有一些有用的数据。同时,程序A自身也需要占用一定的内存,假设占Y兆字节,用来存放只有自己才会用到的数据。(注意,这个Y兆字节,并不一定是程序A当前使用的内存总量,程序A可以向操作系统申请更多内存备用。)然后另一个程序B,也需要调用C,因此也会通过C间接地访问C占用的内存X;同样,B也有自己独享的内存,假设占Z兆字节。然后,系统的内存空间是有限的,操作系统可能会把程序占用的某些内存,从物理内存中移到了硬盘的分页文件(即虚拟内存)中,假设从A中移走了W兆字节,从B中移走了V兆字节。


那么程序A的工作设置内存就是程序A独占的物理内存,加上组件C的内存。即Y-W+X
程序A的内存专用工作集就是程序A独占的物理内存,即Y-W
程序A的提交大小就是程序A独占的内存,包括物理内存和虚拟内存,不包含组件C的内存。即Y

程序B的工作设置内存就是程序B独占的物理内存,加上组件C的内存。即Z-V+X
程序B的内存专用工作集就是程序B独占的物理内存,即Z-V
程序B的提交大小就是程序B独占的内存,包括物理内存和虚拟内存,不包含组件C的内存。即Z



程序A、程序B、组件C,一共占物理内存Y+Z-W-V+X,注意组件C虽然被两个程序使用,但是只占一份内存。(注意,并不是所有的情况下组件C都可以被共享。也有可能程序A和B需要各自复制一个C)


Windows XP任务管理器中,“内存使用”指的是工作设置内存,“虚拟内存使用(翻译错误)”指的是提交大小,即物理内存+虚拟内存。把任务管理器中所有的“内存使用”加起来,得数大于当前物理内存使用量。我以前受XP错误翻译的影响,以为提交大小是虚拟内存占用,其实是物理+虚拟。
Windows 7任务管理器中,默认显示程序占用的内存专用工作集。其余两项可以手动查看。把任务管理器中所有的内存专用工作集加起来,得数小于当前物理内存使用量。

对于一个程序而言,衡量他所占内存的多少,应该看提交大小。金山毒霸曾经宣称自己的杀毒软件只占15M内存,那是不对的,因为他故意只算了内存专用工作集。


另可参考:http://windows.microsoft.com/zh-cn/windows/what-task-manager-memory-columns-mean#1TC=windows-7

IsaacZ 发表于 2015-5-11 21:32:46

嗯,现在好懂多了。
页: [1]
查看完整版本: windows任务管理器中的工作设置内存,内存专用工作集,提交大小详解