为什么 Windows 总是使用与安装的 RAM 一样多的虚拟内存?

tim*_*sku 4 memory windows windows-7 pagefile virtual-memory

为什么它希望最多是该数量的两倍?我的系统有 32GB 的 RAM 和 Windows,默认情况下,设置最小 16MB 虚拟内存,分配 32GB(!) 并推荐 50GB(!!)。在 64GB RAM 系统上更糟糕的是,它建议分配超过 100GB,尽管它“仅”再次使用与 RAM 中可用的相同数量,在这种情况下为 64GB。

据我了解,页面文件的概念是 Windows 仅在需要时扩展它,并从最小数量开始,尽管它从来没有,但它总是进入绝对最大值。这非常烦人,因为禁用页面文件或不将其设置为安装的等量 RAM,会导致一些使用大量内存的程序(如 7zip)出现问题,他们只是声称即使有足够的内存也没有足够的内存可供分配可用内存。

这种行为可能会极大地缩短我的驱动器 (SSD) 的使用寿命。为什么 Windows 会这样做,我该如何防止这种情况发生,或者如何完全禁用页面文件而不会在某些程序中出现奇怪的行为。

Jam*_*han 5

首先,Windows 的对话框(您在其中设置页面文件大小的对话框)将页面文件等同于“虚拟内存”是一个巨大的错误(不是您的)。页面文件只是一种虚拟地址空间的后备存储,由私有提交的内存使用。有由其他文件(映射文件)支持的虚拟地址空间,还有始终不可分页的 vas,因此始终保留在 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)”的数字。例如,我正在查看一台机器,上面写着“Commit (GB) 1/15”。这是 15 GB 限制中的 1 GB 当前提交费用。

如果像 7zip 这样的程序尝试执行例如大小 > (commitLimit - commitCharge) 的 VirtualAlloc,即大于“剩余”提交限制,那么如果操作系统无法扩展页面文件以使提交限制足够大,则分配请求失败。这就是你所看到的。(Windows 实际上没有“物理内存不足”的错误消息,而不是用户模式访问!仅适用于虚拟。)

它与空闲RAM无关,因为所有 RAM(减去不可分页的那一小部分)都计入提交限制,无论它当前是否空闲。

这是令人困惑的,因为当您在这些分配失败之一后查看系统时,没有任何明显错误 - 您查看系统,您的提交费用远低于限制,您甚至可能有很多空闲 RAM。您必须知道程序尝试分配了多少专用内存才能查看问题所在。大多数程序不会告诉你。

听起来像 7zip 在尝试分配 vas 方面过于激进,也许它正在根据您的 RAM 大小扩展其请求?您确定没有更小的页面文件设置可以让 7zip 满意吗?您使用的是 32 位还是 64 位版本的 7-zip?使用 32 位版本可以解决这个问题,因为它不可能使用超过 2 GB 或 3 GB 的虚拟地址空间。当然,在庞大的数据集上它可能没有那么快。

这种行为可能会极大地缩短我的驱动器 (SSD) 的使用寿命。

嗯,不,不是真的。简单地将任何大小的页面文件放在那里并不意味着系统实际上会向页面文件写入那么多。(除非您将选项设置为“关闭时清除页面文件”,否则我认为它不会写出整个内容;Mm 知道正在使用哪些块并且应该只写那些块......我从来没有想过之前;我得检查一下。)

如果您想查看页面文件中的实际内容,请使用 PerfMon 实用程序。页面文件有一个计数器组,您当然需要“%使用率”计数器。根据文件的实际大小解释这个百分比(如资源管理器中所示)。

它确实使用了大量空间,而且由于 SSD 上的空间非常宝贵,因此这是我们大多数人关心的问题。您可以尝试的一件事是在您的 SSD 上放置一个合理大小的页面文件,例如 4 GB 或 8 GB,然后连接一个旋转的 Rust 驱动器并在其上放置一个大页面文件。或者,如果你想要一个 SSD 而你的页面文件没有别的东西,那么就为第二个页面文件买一个便宜的小块。