在我的Windows XP任务管理器中,某些进程在“内存使用情况”列中显示的值高于VMSize。例如,我的Firefox实例将111544 K显示为内存使用情况,将100576 K显示为VMSize。
根据任务管理器的帮助文件,Mem Usage是进程的工作集,VMSize是虚拟地址空间中的已提交内存。
我的问题是,如果进程的已提交页面数为A且同一进程的物理内存中的页数为B,那么它是否应该始终为B≤A?每个进程的物理内存中的页数不是已提交页面的子集吗?
或者这与进程间的内存共享有关吗?请解释。 (也许我对'工作集'的定义不合时宜。)
感谢。
答案 0 :(得分:17)
虚拟内存
假设您的程序(例如Oracle)在启动时分配了100 MB的内存 - 虽然没有触及其他物理/磁盘页,但您的VM大小增加了100 MB。即VM只是记忆簿保存。
总可用物理内存+页面文件内存是系统中所有进程可以分配的最大内存。系统执行此操作,以便它可以确保在任何时间点,如果进程实际开始消耗它分配的所有内存,操作系统可以提供所需的实际物理页面。
私人记忆
如果程序将10 MB数据复制到该100 MB中,则OS会检测到没有页面已分配给与这些地址对应的进程,并将10 MB的物理页面分配到进程的专用内存中。 (此过程称为页面错误)
工作集
定义:工作集是程序最近触及的一组内存页面。
此时,这10个页面将添加到流程的工作集中。如果该过程然后将此数据复制到先前分配的另一个10 MB缓存中,则其他所有内容保持不变,但如果那些旧页面不在工作集中,则工作集再次上升10 Mb。但是如果这些页面已经在工作集中,那么一切都很好,程序工作集保持不变。
工作集行为
想象一下,您的流程永远不会再触及前10页,在这种情况下,这些页面会从流程的工作集中删除,并可能会发送到页面文件,以便操作系统可以引入更频繁使用的其他页面。但是,如果没有紧急的低内存要求,则无需执行此分页操作,操作系统可以充当内存丰富的行为。在这种情况下,工作集只是让这些页面保持不变。
何时工作集>虚拟记忆
现在假设同一个程序取消分配所有100 Mb的内存。程序VM大小立即减少100 MB(记住VM =记录所有内存分配请求)
工作集不需要受此影响,因为这不会改变最近触及的那些10 Mb页面的事实。因此,虽然操作系统可以在需要时回收它们,但这些页面仍然保留在流程的工作集中。
这将有效地使VM<工作集。但是,如果您启动另一个消耗更多内存的进程并且操作系统回收工作集页面,则会纠正此问题。
答案 1 :(得分:3)
XP的任务管理器完全错了。编辑:如果你不相信我(有人没有,因为他们投了这票),请阅读Firefox 3 Memory Usage。我引用:
如果您正在查看内存使用情况 在Windows XP下,您的号码不是 会变得如此伟大。原因: 微软改变了意义 XP和Vista之间的“私有字节” (为了更好)。
听起来像MS感到困惑。如果它坏了,你只能改变那样的东西。
请尝试使用Process Explorer。任务管理器标记“VM Size”,Process Explorer(更正确)标记“Private Bytes”。在Process Explorer中,工作集(和专用字节)总是小于或等于虚拟大小,正如您所期望的那样。
答案 2 :(得分:3)
Mem Usage如何高于VM Size的常见方式是使用文件映射对象(因此它可以与共享内存相关,因为文件映射用于共享内存)。使用文件映射,您可以拥有一个已提交的内存(在页面文件或物理内存中,您不知道),但没有分配给它的虚拟地址。已提交的内存显示在“内存使用情况”中,而使用的虚拟地址使用情况则由“VM大小”跟踪。
另见:
Stackoverflow上的What does “VM Size” mean in the Windows Task Manager?
我的开发者博客中的Usenet讨论Still confused why working set larger than virtual memory
答案 3 :(得分:1)
内存使用量是当前分配给流程的电子内存量。
VM Size 是当前分配给流程的虚拟内存量。
所以......
举例说明:
目前在我的机器上,iexplore的内存使用量为16,000K,VM大小为194,916。这意味着Internet Explorer使用的大部分内存都处于空闲状态,并且已被换出到磁盘,并且只有一小部分内存保存在主内存中。
与mcshield.exe对比,内存使用率为98,984K,VM大小为98,168K。我的结论是,McAfee AntiVirus处于活动状态,并且正在使用大量内存。由于它已经运行了相当长的一段时间(整天,自启动以来),我预计大部分98,168K VM大小都是电子内存的副本 - 尽管任务管理器中没有任何内容可以确认这一点。
答案 4 :(得分:0)
工作集(A) - 这是一组进程的虚拟内存页面(已提交),位于物理RAM中。这些页面完全属于该过程。工作集就像“当前/最近在这些页面上工作”列表。
虚拟内存 - 这是操作系统可以寻址的内存。无论物理RAM或硬盘空间的大小,此数量都受处理器体系结构的限制。
提交内存 - 当应用程序触摸虚拟内存页面(读取/写入/编程提交)时,页面将成为已提交的页面。它现在由物理内存页面支持。这通常是物理RAM页面,但最终可能是硬盘上页面文件中的页面,或者它可能是硬盘上内存映射文件中的页面。内存管理器处理从虚拟内存页面到物理页面的转换。虚拟页面可以位于物理RAM中,而旁边的页面可以位于页面文件中的硬盘驱动器上。
但是:PF(页面文件)用法 - 这是系统上已提交页面的总数。它不会告诉您实际写入页面文件的数量。它只告诉您如果必须同时将所有提交的页面写入页面文件,将使用多少页面文件。
因此B>甲...
如果我们同意B代表“内存使用”或PF使用,则问题来自它实际代表potential page usages的事实:在Xp中,这个潜在的文件空间可以用作分配虚拟空间的地方程序要求的内存页面,但从未投入使用......
答案 5 :(得分:0)
内存碎片可能是原因: 如果进程分配1个八位位组,则它在VMSize中计为1个八位位组,但是这个1个八位位组需要一个物理页面(Windows操作系统上的4K)。 如果在分配/释放存储器之后,该进程具有与第一个八位字节隔开超过4K的第二个八位字节,则该第二个八位字节将始终存储在与1之间不同的物理页面上。 因此,VM大小计数为2个八位字节,但内存使用量为2页== 8K
因此,MemUsage大于VMSize的事实表明,该进程会进行大量的分配和释放,并对内存进行分段。 这可能是因为该过程很久以前就开始了。 或者有优化的地方; - )