假设系统的总内存消耗(虚拟+物理)是Windows中任务管理器显示的“内存使用”和“VM大小”列的总和,这是正确的吗?
答案 0 :(得分:3)
阅读Mark Russinovich的这些帖子:
http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx
http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx
答案 1 :(得分:2)
在现代Windows中,“总内存消耗”确实没有单一的真相。这当然取决于定义,但真正的问题是你想要回答的问题。
像SQL-Server这样的某些进程倾向于使用他们可以获取的每个内存字节,如果你允许的话。 .NET CLR垃圾收集器监视内存使用情况并采取相应措施,尝试在内存不足时释放更多内存。
因此,例如,您可以拥有一个具有8 GB物理内存的系统,其中90%是“已使用”。实际上需要多少内存,很难说。同一系统可以在4 GB机器上运行,没有明显的性能损失或任何其他问题。
如果您想在Windows下探索内存管理的一些复杂性,请从以前的sysinternals站点下载"VMMap v2.0"。它显示了每个进程非常详细的内存使用情况,可能会帮助您完成任务。
引用VMMaps帮助: VMMap将内存分为以下几种类型之一:
图片强> 内存表示可执行文件,例如.exe或.dll。 “详细信息”列显示文件的路径。
<强>私人强> 私有内存不能与其他进程共享,根据系统提交限制收费,并且通常包含应用程序数据。
<强>共享的强> 可共享内存可以与其他进程共享,根据系统提交限制收费,并且通常包含不同进程中的DLL之间共享的数据或进程间通信消息。 Windows API将此类型的内存称为页面文件支持的部分。
映射文件 内存表示磁盘上的文件,“详细信息”列表示文件的路径。映射文件通常包含应用程序数据。
<强>堆强> 堆表示由用户模式堆管理器管理的内存,并且与私有内存一样,根据系统提交限制收费并包含应用程序数据。
托管堆 托管堆表示由.NET垃圾收集器分配和使用的内存。
<强>堆栈强> 堆栈是用于存储各个线程的函数参数,本地函数变量和函数调用记录的内存。堆栈再次按提交限制收费,通常按需增长。
<强>系统强> 系统内存是与进程关联的内核模式物理内存。绝大多数系统内存由进程页表组成。
<强>免强> 可用内存区域是进程地址空间中未分配的空间。
现在您只需要定义您认为“已使用”的内存类型,为所有进程添加这些内存,删除多个重复内容并查看数字...在任务管理器或其他工具中有一个原因,没有标有“总内存消耗”的单个数字: - )
答案 2 :(得分:1)
不,物理内存和虚拟内存可能重叠。如果一页内存位于虚拟内存中,然后分页到物理内存,则不一定要释放虚拟内存,可以在页面再次被页面调出时保留。