系统总内存消耗

Posted

技术标签:

【中文标题】系统总内存消耗【英文标题】:Total memory consumption of the system 【发布时间】:2009-06-10 07:16:04 【问题描述】:

假设系统的总内存消耗(虚拟 + 物理)是 Windows 中任务管理器显示的“内存使用”和“虚拟机大小”列的总和是否正确?

【问题讨论】:

【参考方案1】:

阅读 Mark Russinovich 的这些帖子:

http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx

http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx

【讨论】:

是的,Mark 提供了对 Windows 内部结构的深刻洞察。【参考方案2】:

在现代 Windows 中,确实没有关于“总内存消耗”的单一事实。这当然取决于定义,但真正的问题是你想对答案做什么。

如果您允许,某些进程(如 SQL-Server)倾向于使用他们可以获得的每一个内存字节。 .NET CLR 垃圾收集器监控内存使用情况并采取相应措施,在内存不足时尝试释放更多内存。

因此,例如,您可以拥有一个具有 8 GB 物理内存的系统,其中 90% 已“使用”。实际上需要多少内存,很难说。相同的系统可以在 4 GB 的机器上运行,而不会出现明显的性能损失或任何其他问题。

如果您想探索 Windows 下内存管理的一些复杂性,请从以前的 sysinternals 站点下载"VMMap v2.0"。它显示了每个进程的非常详细的内存使用情况,可以帮助您完成任务。

引用 VMMaps 帮助: VMMap 将内存分为以下几种类型之一:

图片 内存代表可执行文件,例如.exe 或.dll。详细信息列显示文件的路径。

私人 私有内存不能与其他进程共享,根据系统提交限制收费,通常包含应用程序数据。

可分享 可共享内存可以与其他进程共享,根据系统提交限制收费,通常包含在不同进程中的 DLL 之间共享的数据或进程间通信消息。 Windows API 将这种类型的内存称为页面文件支持的部分。

映射文件 内存代表磁盘上的文件,详细信息列显示文件的路径。映射文件通常包含应用程序数据。

堆表示由用户模式堆管理器管理的内存,并且与私有内存一样,根据系统提交限制收费并包含应用程序数据。

托管堆 托管堆表示由 .NET 垃圾收集器分配和使用的内存。

堆栈 堆栈是用于存储各个线程的函数参数、局部函数变量和函数调用记录的内存。堆栈按提交限制计费,通常会按需增长。

系统 系统内存是与进程关联的内核模式物理内存。绝大多数系统内存由进程页表组成。

免费 空闲内存区域是进程地址空间中未分配的空间。

现在您只需要定义您认为“已使用”的内存类型,将这些添加到所有进程中,删除多个重复项并查看数量...在任务管理器或其他工具中,这是有原因的,没有标记为“总内存消耗”的单个数字:-)

【讨论】:

【参考方案3】:

不,物理内存和虚拟内存可能重叠。如果一页内存在虚拟内存中,然后被分页到物理内存,则虚拟内存不一定会被释放,它可能会被保留以供再次分页时使用。

【讨论】:

但这仍然是消耗的内存。即使它有点被浪费了。即使它即将被垃圾收集,我也可以。只要它被使用它是可以接受的。我更感兴趣的是除了这两列之外还有什么其他的吗? (可能是任务管理器中未显示的内部内核内存使用情况)

以上是关于系统总内存消耗的主要内容,如果未能解决你的问题,请参考以下文章

最佳内存消耗方案

#工程经验分享# 内存泄露排查

#工程经验分享# 内存泄露排查

总的物理内存和可用物理内存啥意思

Visual C++ 检查进程内存中的对象实例大小[关闭]

计算Java中任何对象的总内存使用量[重复]