在WinXP任务管理器中,“内存使用量”高于“虚拟内存大小”的原因是什么?

12

在我的Windows XP任务管理器中,一些进程在“内存使用”列中显示的值比“VMSize”更高。例如,我的Firefox实例显示111544 K的内存使用和100576 K的VMSize。

根据任务管理器帮助文件,“内存使用”是进程的工作集,而“VMSize”是虚拟地址空间中已提交的内存。

我的问题是:如果一个进程的提交页面数为A,同一进程在物理内存中的页面数为B,那么应该始终满足B ≤ A,不是吗?在每个进程中,物理内存中的页面数不是已提交页面的子集吗?

还是这与进程之间共享内存有关?请解释一下。(也许我的“工作集”定义有误)。

谢谢。

6个回答

17

虚拟内存

假设您的程序(例如Oracle)在启动时分配了100 MB的内存 - 虽然没有触碰任何其他磁盘物理页,但是您的VM大小会增加100 MB。即VM只是内存管理。

可用物理内存+分页文件内存的总和是系统中所有进程可以分配的最大内存。系统采取这种方法是为了确保如果进程实际上开始消耗它分配的所有内存,操作系统可以提供实际所需的物理页面。

私有内存

如果程序将10 MB的数据复制到该100 MB中,操作系统会感知到该进程对应地址没有分配任何页面,并将价值10 MB的物理页面分配给您的进程的私有内存。(此过程称为“页错误”)

工作集

定义:工作集是程序最近访问的一组内存页。

此时,这10页被添加到该进程的工作集中。 如果该进程随后将此数据复制到先前分配的另外10 MB缓存中,则除了工作集之外的所有内容都保持不变,如果这些旧页面不在工作集中,则工作集再次增加10 Mb。但是,如果这些页面已经在工作集中,则一切正常,程序的工作集保持不变。

工作集行为

想象一下,您的进程永远不会再次触碰前10页,在这种情况下,这些页面将从您的进程的工作集中删除,并且可能被发送到分页文件中,以便操作系统可以带入更频繁使用的其他页面。但是,如果没有紧急的低内存需求,则无需执行页面调度操作,操作系统可以像拥有丰富的内存一样运行。在这种情况下,工作集只是让这些页面保持不变。

何时工作集>虚拟内存

现在想象同一个程序取消分配所有100 Mb的内存。程序的VM大小立即减少了100 MB(请记住,VM =所有内存分配请求的簿记)

工作集不需要受到影响,因为这并不改变最近访问过的那10MB页面的事实。因此,这些页面仍然保留在进程的工作集中,尽管操作系统随时可以回收它们。

这将有效地使虚拟内存小于工作集。但是,如果启动消耗更多内存的另一个进程,并且工作集页面被操作系统回收,这种情况将得到纠正。


是的。操作系统允许释放的页面停留在物理内存中,这似乎是这种现象的一个很好的解释。 - Frederick The Fool
虽然我认为分配100MB并不会立即导致VMSize增加100MB。至少在Windows中,那100MB将首先被标记为“保留”。当您将10MB写入该100MB的某个位置时,那10MB将被标记为“已提交”,并且VMSize将增加10MB(而不是100MB)。 - Frederick The Fool
1
运行了一些测试-分配了100MB,内存和虚拟内存都增加了。只写入10MB后,内存使用量降至10MB。 - computinglife
1
当我分配了1024 MB的虚拟机大小时,虚拟机大小确实为1024 Mb,但内存使用量仍保持在约35 MB的任意值。在此之后写入10MB并没有增加内存使用量,因为我想内存使用量已经包括了前面的10MB。 - computinglife
总之,我想说,分配的内存中有多少被标记为真正的页面并转化为内存大小/工作集,取决于具体情况和操作系统。但总体来说,虚拟内存大小和工作集之间的概念/区别就像我描述的那样。 - computinglife
显示剩余2条评论

3
XP的任务管理器是错误的。编辑:如果你不相信我(有人不相信,因为他们投了反对票),请阅读Firefox 3内存使用情况。我引用如下:
如果您在Windows XP下查看内存使用情况,那么您的数字将不会太好。原因是:Microsoft在XP和Vista之间改变了“私有字节”的含义(更好的)。
听起来像MS感到困惑了。只有当它出了问题才会更改这样的东西。
相反,请尝试Process Explorer。任务管理器标签中的“VM Size”,Process Explorer(更正确地)标签为“Private Bytes”。而且在Process Explorer中,工作集(和私有字节)始终小于或等于虚拟大小,正如您所期望的那样。

我认为它出错的可能性不大,因为它非常出名且常用。相反,可能是我混淆了这些术语的定义。 - Frederick The Fool
你没有混淆术语。我已经编辑了我的答案以提供更多信息。 - Hugh Allen

3

文件映射

内存使用量高于虚拟内存大小的常见原因之一是使用文件映射对象(因此它可能与共享内存有关,因为文件映射用于共享内存)。使用文件映射,您可以拥有一个已提交的内存(无论是在页面文件中还是在物理内存中,您都不知道),但未分配虚拟地址。已提交的内存显示在内存使用量中,而使用的虚拟地址使用情况由虚拟内存大小跟踪。

另请参阅:

Windows任务管理器中“VM Size”是什么意思? Stackoverflow 上的文章

突破32位限制 我的开发者博客

Usenet 讨论:仍然困惑为什么工作集大于虚拟内存


1

内存使用量是当前分配给进程的电子存储器数量。

虚拟内存大小是当前分配给进程的虚拟内存数量。

所以...

  • 仅存在于电子形式的页面将只会增加内存使用量。
  • 仅存在于磁盘上的页面将只会增加虚拟内存大小。
  • 同时存在于内存和磁盘上的页面将同时增加两者。

下面是一些示例:

在我的计算机上,iexplore具有16,000K的内存使用量和194,916的VM大小。这意味着Internet Explorer使用的大部分内存都是空闲的,并已被交换到磁盘上,只有一小部分保留在主存储器中。

对比一下,mcshield.exe具有98,984K的内存使用量和98,168K的VM大小。我在这里的结论是McAfee AntiVirus正在运行,并且使用了大量内存。由于它已经运行了相当长的时间(整天,从启动开始),我预计98,168K VM大小的大部分是电子内存的副本 - 尽管任务管理器中没有任何内容可以证实这一点。


0

内存碎片化可能是原因: 如果进程分配了1个八位字节,它在VMSize中计为1个八位字节,但这1个八位字节需要一个物理页面(在Windows操作系统上为4K)。 如果在分配/释放内存后,进程有第二个八位字节与第一个八位字节相隔超过4K,那么这第二个八位字节将始终存储在与第一个八位字节不同的物理页面上。 因此,VM Size计数为2个八位字节,但Memory Usage为2个页面== 8K

因此,MemUsage大于VMSize表明进程进行了大量的分配和释放,并且碎片化了内存。 这可能是因为进程启动了很长时间。 否则,就有优化的空间;-)


0

你可能会在内存壳游戏中找到一些解释。

工作集(A)-这是进程的一组虚拟内存页面(已提交),并位于物理RAM中。这些页面完全属于该进程。工作集就像一个“当前/最近正在处理这些页面”的列表。

虚拟内存-这是操作系统可以寻址的内存。无论物理RAM或硬盘空间的数量如何,此数字都受处理器架构的限制。

提交的内存-当应用程序触及虚拟内存页面(读取/写入/编程提交)时,该页面变为已提交页面。现在它由物理内存页面支持。这通常是物理RAM页面,但最终可能是硬盘上的页面文件中的页面,也可能是硬盘上的内存映射文件中的页面。内存管理器处理从虚拟内存页面到物理页面的转换。虚拟页面可以位于物理RAM中,而其旁边的页面可以位于页面文件中的硬盘上。

BUT: PF(页面文件)使用情况 - 这是系统上已提交页面的总数。 它并不告诉您实际写入页面文件的数量。 它只告诉您如果所有提交的页面必须同时写入页面文件,那么页面文件将使用多少。

因此 B > A...

如果我们同意B代表“内存使用情况”或PF使用情况,问题在于它实际上代表潜在页面使用情况:在Xp中,这个潜在的文件空间可以用作分配程序请求但从未使用的虚拟内存页面的地方...


你的帖子最后一部分并没有暗示 B > A。相反,如果一个进程的已提交页面总数为 A,其中在物理内存中的数量为 B,则无论 VonC 说了什么,B ≤ A,因为物理内存中的页面只能是已提交页面的子集。 - Frederick The Fool
但是,“Xp任务管理器”报告它们的方式,B“内存使用情况”,不仅仅是物理内存,还包括硬盘上的页面文件。 - VonC
哦。但是任务管理器帮助文件说“Mem Usage”是工作集,如果我没有错的话,工作集仅限于物理内存中的页面。但即使你所说的是正确的,那么B = A而不是B > A,因为A是总承诺的虚拟内存:在RAM中的页面+在磁盘中的页面。 - Frederick The Fool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接