12

在我的 Windows XP 任务管理器中,某些进程在 Mem Usage 列中显示的值高于 VMSize。例如,我的 Firefox 实例显示内存使用量为 111544 K,VMSize 为 100576 K。

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

我的问题是,如果一个进程的已提交页数是 A,而同一进程的物理内存中的页数是 B,那么它不应该总是 B ≤ A 吗?每个进程的物理内存中的页面数不是已提交页面的子集吗?

或者这与进程之间的内存共享有关?请解释。(也许我对“工作集”的定义不合时宜)。

谢谢。

4

6 回答 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 = 所有内存分配请求的簿记)

工作集不必受此影响,因为这不会改变最近触及的那些 10 Mb 页面的事实。因此,尽管操作系统可以在需要时回收它们,但这些页面仍然保留在进程的工作集中。

这将有效地使 VM < 工作集。但是,如果您启动另一个消耗更多内存的进程并且操作系统回收工作集页面,这将纠正。

于 2008-10-31T09:21:53.887 回答
3

XP的任务管理器是完全错误的。编辑:如果你不相信我(有人不相信,因为他们投了反对票),请阅读Firefox 3 Memory Usage。我引用:

如果您正在查看 Windows XP 下的内存使用情况,您的数字不会那么好。原因:微软在 XP 和 Vista 之间改变了“私有字节”的含义(为了更好)。

听起来MS很困惑。如果它坏了,你只会改变类似的东西。

请尝试使用Process Explorer。任务管理器标记为“VM 大小”,进程资源管理器(更正确)标记为“私有字节”。如您所料,在 Process Explorer 中,Working Set(和 Private Bytes)总是小于或等于 Virtual Size。

于 2008-10-31T07:24:09.910 回答
3

文件映射

Mem Usage 高于 VM Size 的非常常见的方法是使用文件映射对象(因此它可以与共享内存相关,因为文件映射用于共享内存)。使用文件映射,您可以拥有一个已提交的内存(在页面文件或物理内存中,您不知道),但没有分配给它的虚拟地址。提交的内存出现在 Mem Usage 中,而使用的虚拟地址使用情况由 VM Size 跟踪。

也可以看看:

Windows 任务管理器中的“VM 大小”是什么意思?在 Stackoverflow 上

在我的开发者博客中打破 32 位障碍

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

于 2008-10-31T11:23:42.627 回答
1

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

VM Size是当前分配给进程的虚拟内存量。

所以 ...

  • 仅以电子方式存在的页面只会增加内存使用量。
  • 仅存在于磁盘上的页面只会增加 VM 大小。
  • 同时存在于内存和磁盘中的页面将同时增加。

一些例子来说明:

目前在我的机器上,iexplore 有 16,000K 内存使用和 194,916 VM 大小。这意味着 Internet Explorer 使用的大部分内存都处于空闲状态并已换出到磁盘,只有一小部分保留在主内存中。

与 mcshield.exe 相比,它的内存使用量为 98,984K,VM 大小为 98,168K。我的结论是,McAfee AntiVirus 处于活动状态,正在使用大量内存。由于它已经运行了很长一段时间(自启动以来一整天),我预计 98,168K VM 大小中的大部分是电子内存的副本——尽管任务管理器中没有任何内容可以证实这一点。

于 2008-10-31T05:32:48.887 回答
0

您可能会在The Memory Shell Game中找到一些解释

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

虚拟内存——这是操作系统可以寻址的内存。无论物理 RAM 或硬盘空间有多少,这个数字都受您的处理器架构的限制。

已提交内存– 当应用程序接触到虚拟内存页面(读/写/以编程方式提交)时,该页面成为已提交页面。它现在由物理内存页面支持。这通常是一个物理 RAM 页面,但最终可能是硬盘上页面文件中的一个页面,或者它可能是硬盘上内存映射文件中的一个页面。内存管理器处理从虚拟内存页面到物理页面的转换。虚拟页面可能位于物理 RAM 中,而它旁边的页面可能位于页面文件中的硬盘驱动器上。

但是:PF(页面文件)使用 - 这是系统上已提交页面的总数。它不会告诉您实际写入页面文件的数量。它仅告诉您如果必须同时将所有已提交的页面写出到页面文件中,将使用多少页面文件。

因此 B > A ...

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

于 2008-10-31T05:12:34.450 回答
0

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

因此,MemUsage 大于 VMSize 的事实表明,进程执行了大量的分配和释放操作,并对内存进行了碎片化。这可能是因为该过程是很久以前开始的。否则有优化的地方;-)

于 2010-03-06T17:36:19.513 回答