提交费用为 100%,但在不使用页面文件时物理内存仅为 60%

Jas*_*edo 33 memory windows-7 virtual-memory

我已禁用页面文件在我的系统(硬盘是缓慢,不能买一个新的马上,不能页面文件移动到另一个分区)。当我看到资源监视器,使用内存要求很高的应用程序时,系统显示提交费用几乎 100% 已满。事实上,如果我继续要求更多的内存,当提交费用有效地达到 100% 时,程序就会开始崩溃。

与此同时,系统说我只使用了 50-60% 的物理内存,并且有大约 1GB 的可用内存(空闲 + 待机)。

如果提交费用是实际请求的总内存,为什么系统会说有这么多内存是空闲的?Windows 是否未使用物理内存?内存图错了吗?我错过了什么吗?

提交电荷图与物理内存图 任务管理器

Jam*_*han 37

在您仍有大量可用 RAM 的情况下用尽提交限制并不罕见。提交限制和提交费用都与免费或可用 RAM 没有直接关系。

提交限制 = 当前页面文件大小 + RAM 大小。

由于您没有页面文件,提交限制比拥有页面文件时要小。有多少 RAM可用并不重要。对于提交限制,只有安装的 RAM 量很 重要。即使 90% 的 RAM 可用或可用,您也可能会用完提交限制。

提交费用是虚拟内存的计数,而不是物理内存。假设我的程序要求提交 2 GB,但它只访问其中的 0.5 GB。剩余的 1.5 GB 永远不会出错,永远不会分配给 RAM,因此 RAM 使用量不会反映 2 GB,只有 0.5 GB。

尽管如此,“系统提交”还是增加了 2 GB,因为系统已经“承诺”将有一个地方可以存放我的 2 GB,如果我真的需要它的话。在程序的任何给定运行中,我不一定会尝试使用它这一事实并没有帮助。我要求 2 GB 并且从该调用成功返回告诉我操作系统“承诺” - 即承诺 - 我可以使用那么多的虚拟地址空间。除非有地方可以保留所有内容,否则操作系统无法做出这一承诺。

所以:把你的页面文件放回去,增加更多的内存,或者一次运行更少的东西。或三者的某种组合。这些是避免“内存不足”和“内存不足”错误的唯一选择。

另请参阅我的答案here(更长)和here(更长)。

  • 具体来说,在 Windows 分配内存之前,它希望能够保证在使用这些分配时能够完成这些分配。即使分配没有被完全使用,如果 Windows 不能保证,它也会拒绝分配更多。页面文件,无论是否使用,都提供额外的后备存储。 (4认同)

cns*_*nst 6

正如http://brandonlive.com/2010/02/21/measuring-memory-usage-in-windows-7/上的文章中的内存分配测试所示,Windows 是一种无法进行大内存分配的系统如果这样的分配,连同所有先前的分配(微软称之为“提交”的概念),将使“提交”总数超过物理内存和所有页面文件(交换)的总和。

考虑到在上述分配的进程的虚拟地址空间内进行读取或写入之前,分配本身不使用任何实际内存(既不是物理内存也不是交换内存)。例如,2GB 分配本身只会影响“提交”数字(在 Windows 7 中),而单独保留“物理内存”(直到在所述分配中进行读/写)。

就操作系统设计而言,另一种方法是始终允许分配任何大小(除非可用内存已经完全耗尽),然后让应用程序在读/写时失败。有关更多详细信息,请参阅https://cs.stackexchange.com/questions/42877/when-theres-no-memory-should-malloc-or-read-write-fail

  • 是的。Windows 方法的论据:期望程序员检查 malloc(或在 Win32 中,VirtualAlloc)的状态是合理的。一旦调用成功,程序就可以相信分配的 vas 是可用的,并且会一直如此,直到相应的 free 或 VirtualFree。另一方面,普通的内存读取和写入(即取消引用指针)会引发内存访问异常。但是没有程序员希望在每次指针取消引用后都必须检查状态。他们无论如何都不会返回状态,因此必须使用异常处理程序来完成。丑陋的。 (3认同)