为什么它最多要占用两倍的内存?我的系统有 32GB 的 RAM,Windows 默认设置最小虚拟内存为 16MB,分配了 32GB(!),建议分配 50GB(!!)。更糟糕的是,在 64GB RAM 系统中,它建议分配超过 100GB,尽管它“仅”再次使用了与可用 RAM 相同的量,在本例中为 64GB。
据我了解,页面文件的概念是 Windows 仅在需要时才对其进行扩展,并且从最小量开始,尽管它从不这样做,但总是会达到绝对最大值。这非常烦人,因为禁用页面文件或不将其设置为与安装的 RAM 相等的数量会导致某些使用大量内存的程序(如 7zip)出现问题,它们只是声称没有足够的内存可分配,即使有足够多的可用内存。
这种行为可能会极大地缩短我的驱动器 (SSD) 的使用寿命。为什么 Windows 会这样做?我该如何防止这种情况发生?或者我该如何完全禁用页面文件,而不会在某些程序中出现奇怪的行为。
答案1
首先,Windows 的对话框(即设置页面文件大小的对话框)将页面文件等同于“虚拟内存”,这是一个巨大的错误(不是您的错误)。页面文件仅仅是一类虚拟地址空间的后备存储,由私有已提交内存使用。虚拟地址空间由其他文件(映射文件)支持,虚拟地址空间始终不可分页,因此始终保留在 RAM 中。但这一切都是“虚拟内存”,至少从虚拟地址到 RAM 地址的转换始终在进行。
您的观察是正确的:Windows 的页面文件大小分配使用一个简单的计算方法,默认值 = RAM 大小,最大值 = 其两倍。(以前是 1.5 倍和 3 倍。)他们必须将其设置为某个值,这些因素提供的结果几乎总是足够的。它还保证了足够的页面文件空间来在系统崩溃时捕获内存转储(假设您已启用内核或完整转储)。
据我理解,页面文件的概念是 Windows 仅在需要时才扩展它,并且从最小量开始,尽管它从来不这样做,但它总是进入绝对最大值。
啊……它从“初始大小”开始。这不是“允许的最小值”。这就是为什么您看到 RAM 大小,因为 Windows 将其用作初始大小。
但是……您是说您看到实际页面文件大小达到最大设置了吗?例如,如果初始设置为 16 GB,最大设置为 32 GB,您看到的实际大小(“当前分配”)为 32 GB?顺便说一句,重新启动时它应该始终恢复到初始大小。
您是否看到“系统虚拟内存不足”的弹出窗口?当操作系统将页面文件扩展到当前大小之外时,您应该会看到它。
除非有什么东西试图分配太多的私有已提交内存,以至于需要扩大的页面文件空间来存储这些内容,否则操作系统不会扩大页面文件。但是,也许有什么东西已经这样做了。查看任务管理器的进程选项卡。“提交大小”列显示每个进程的提交大小。单击列标题可查看谁占用了最多的内存。:)
这非常烦人,因为禁用页面文件或不将其设置为与安装的 RAM 数量相等,会导致一些使用大量内存的程序(如 7zip)出现问题,它们只是声称没有足够的内存可分配,即使有足够多的可用内存。
这与可用 RAM 无关,而是与所谓的“提交费用”和“提交限制”有关。“提交限制”是(RAM - 不可分页虚拟内存)+ 当前页面文件大小的总和。(不是可用 RAM,只是 RAM。)因此,假设一个具有 8 GB RAM 和 16 GB 当前页面文件的系统将具有大约 24 GB 的提交限制(“大约”,因为保存不可分页内容的 RAM 不计入提交限制)。
“提交费用”是指系统中当前有多少私有地址空间。该费用必须小于提交限制,否则系统无法保证该内容有地方存放。
在任务管理器的“性能”选项卡上,您可以看到这两个数字,并带有图例“提交 (GB)”。例如,我正在查看一台显示“提交 (GB) 1/15”的机器。这意味着 15 GB 限制中的 1 GB 当前提交量。
如果像 7zip 这样的程序尝试执行 VirtualAlloc,其大小 > (commitLimit - commitCharge),即大于“剩余”提交限制,那么如果操作系统无法扩展页面文件以使提交限制足够大,则分配请求会失败。这就是您看到的情况。(Windows 实际上没有“物理内存不足”的错误消息,用户模式访问没有!只有虚拟的。)
这与自由的RAM,因为所有 RAM(减去不可分页的一小部分)都计入提交限制,无论它当前是否空闲。
这很令人困惑,因为当您在发生这些分配失败后查看系统时,似乎没有任何问题 - 您查看系统,您的提交费用远低于限制,甚至可能有很多可用 RAM。您必须知道程序试图分配多少私有提交内存才能知道问题所在。大多数程序都不会告诉您。
在我看来,7zip 在分配 vas 时过于激进,也许它是根据您的 RAM 大小来调整其请求?您确定没有较小的页面文件设置可以让 7zip 满意吗?您使用的是 32 位还是 64 位版本的 7-zip?使用 32 位版本可以解决这个问题,因为它不可能使用超过 2 或 3 GB 的虚拟地址空间。当然,在处理大型数据集时,它可能不会那么快。
这种行为可能会极大地缩短我的驱动器(SSD)的使用寿命。
嗯,不,不是真的。简单地将一个页面文件放在那里,无论大小如何,并不意味着系统实际上会将那么多内容写入页面文件。(除非您将选项设置为“关机时清除页面文件”,即使这样,我也不认为它会写入所有内容;Mm 知道哪些块正在使用,并且应该只写入那些……我以前从未想过这一点;我得检查一下。)
如果您想查看页面文件中实际有多少内容,请使用 PerfMon 实用程序。页面文件有一个计数器组,您当然需要“使用率”计数器。根据文件的实际大小解释此百分比(如 Explorer 中所示)。
它确实占用了大量空间,而且由于 SSD 上的空间非常宝贵,因此这对我们大多数人来说都是一个问题。您可以尝试将一个合理大小的页面文件(例如 4 或 8 GB)放在 SSD 上,然后连接旋转式锈蚀驱动器并将一个大型页面文件放在该驱动器上。或者,如果您想要一个 SSD 而不需要其他任何东西来存放页面文件,请购买一个便宜的小型 SSD 仅用于存放第二个页面文件。