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