16GB x64 Windows 的“低内存警告”阈值是多少?

16GB x64 Windows 的“低内存警告”阈值是多少?

编辑4我们现在有答案了。感谢所有参与测试的人,尤其是 Jamie。由于答案已被删除,这里是简短的总结:Win10 引入了内存压缩,使这种测试变得困难且部分毫无意义。如果(在 Win8 x64 上)您尝试禁用页面文件并编写测试应用程序来分配内存,则很可能在核心耗尽(CC 耗尽)之前就遇到分配失败。Jamie 所做的是编写一个应用程序来执行数百万次小分配,这些分配确实成功地使用了最后一点内存没有低内存警告。因此该机制在 Win 8 上根本不再存在,如果您禁用页面文件,您收到的第一个警告就是崩溃。

WRT 未能分配“正常大小”内存但还剩有大量 CC,这可能是由于碎片造成的。


对于 8GB 或 6GB 的 Windows 8.1 x64 机器,如果可用 RAM 低于系统总 RAM 量的 20%(分别为 1.6GB 和 1.2GB),并且页面文件中没有更多空间,则会出现内存不足警告。如果页面文件空间可用,则物理内存将分配到页面文件中,以保留 20% 或 RAM。因此,如果您使用大量模组玩 Skyrim 并收到内存不足警告,您可能会看到页面文件已完全填满,可用 RAM 略低于 20%。

有人试过 16GB Windows 机器的限制吗?它是否不受限制,即您会在 3.2GB 时收到内存不足警告?

尝试此操作的最简单方法是完全禁用页面文件或将其设置为较低的值(例如 1GB),然后启动几个使用高内存的应用程序和/或只使用这个小实用程序:http://www.soft.tahionic.com/download-memalloc/

我想自己测试一下,但是我没有配备 16GB(或更多)内存的电脑。

在 Win8.1 中,实际内存使用数字有点难以查看,因为性能监视器不会显示页面文件使用情况。但任务管理器会为您提供“已提交”值,显示正在使用的总内存(包括页面文件)

编辑:进程资源管理器系统信息可能是监控内存使用情况的最佳方式。提交费用和限制是这里的相关部分,如果您没有页面文件,则提交限制 = RAM,当您获得 ~81% 提交费用时,您应该会收到内存不足警告。

编辑2:为了使其更加明确,下面是我所问的两种情况的伪代码

案例 A 在发出警告之前,最小可用内存(可用提交费用)可以增长多少没有限制:

if (CC/CL) > 0.8 then print "low memory warning"

情况 B 最小可用内存(可用提交费用)限制为某个绝对值,并且在超过该值之前不会发出警告:

if (CC/CL) > 0.8 and if (CL-CC) < 2048MB then print "low memory warning"

编辑3:事实证明,当实际 RAM 足够低时,Windows 10 会压缩内存。这自然使这项测试更难执行。您仍然可以耗尽可用的 RAM 以确保安全,但 Windows 将非常有效地压缩具有零值的 malloc。在 Win8.1 x64 及更早版本中,这是一项简单的任务。

更新

我现在很不幸,不得不使用 4GB 的 Windows 7 x64 机箱。在这个系统中,Windows 会尝试保留约 800MB 的可用物理内存。这当然是我们所熟悉的 20% 部分。而且这比 8GB 机箱上的 1.6GB“保留”要糟糕得多。

我看到版主删除了我的回答,其中我使用专门编写的程序总结了 Jamie 的发现,以穷尽核心。谢谢。

答案1

这里存在一些误解,为了原帖者的利益,我想澄清一下。

@David Schwartz 的回答虽然不完整,但肯定是准确的,不过我想补充一下他所说的内容。

@OP 2011 年,我的雇主委托我寻找这个问题的答案。
经过大约 3 个月的硬件测试和大量研究,我终于找到了答案。

这与页面文件或应用程序 malloc/vmalloc 分配无关。问题主要在于过时的 API 和一些损坏的 D3D 实现。

简短的回答是:

WDDM2.0 + D3D11.2 +4GB GPU

缺失的 2/4GB RAM 已为 GPU 保留。CPU 无法触及它,因此它不存在。无论 VRAM 是否使用,它都会被保留,并映射到 GPU 地址空间。

RAM 是GPU 保留不会显示在系统提交限制中,因为它不可用于 CPU。也不会显示在提交费用中,因为它未分配 - 仅保留。

^^ Russunovich 实际上在 Winternals 第 7 版中谈到了这种异常。这只是资源使用 API 的问题,仅此而已。

我从头到尾读了这本书,试图弄清楚为什么我丢失的内存总是等于 GPU 上的 VRAM 数量。

从 DX11.2 开始,WDDM 2.0 支持 CPU RAM 和 GPU VRAM 之间的统一寻址,这意味着 GPU 可以将 RAM 映射到它自己的地址空间中,以实现零拷贝分页、平铺资源或缓冲。

这就是问题所在,动态资源分配原本应该在 8.1 中得到支持,但直到 W10 才实现。动态资源分配是 DX11.x 的一项功能,允许在游戏过程中动态调整 GPU 保留的系统内存大小并将其返回给 CPU。“动态”部分从未实现,但保留系统内存却实现了。

实际情况是:8GB RAM 和 4GB GPU,其中 4GB RAM 被分割为保留

因此,如果您在 8.1 上拥有具有 4GB VRAM 的 GPU,则会切掉 4GB 的系统 RAM 并保留给 GPU,只留下 4GB 给整个系统的其余部分。

在 8.1/Dx11 中禁用 Pagefile 运行是可以的,只需记住根据您拥有的 VRAM 数量添加一些额外的 RAM。

另一个讽刺之处是,因为 DX9 是 32 位,所以游戏不支持超过 4GB 的地址空间,哈哈,所以保留了 4GB 的 RAM,但像 Fallout NV 这样的游戏根本无法使用它……哈哈。

我们在我所在的地方进行了相当多的平台测试,我发现有效的经验法则是 16GB RAM 和 4GB GPU,这对于占用 RAM 的 DX12 游戏提供了约 12GB 的可用空间。

你可以使用 W10(呃),它不会遇到这些问题。:P

顺便说一下,MSDN d#d 库中还有一个页面,其中介绍了 DX9 GPU

现在,确实如此,当 mm 发现 RAM 不足时,它会尝试恢复一些:通过调出长时间空闲的进程,以及所有进程最近未访问的页面。 Jamie Hanrahan

这并不完全正确。空闲进程不会被调出页面,只会修剪工作集(如果可能)。
任何空闲的多余页面都会刷新到磁盘,但有一个最小 WS 大小始终驻留在 RAM 中。

不过,修剪 WS 是最后的手段,这是 RAM 不足的标志。内存通常首先从待机列表中清除映射/缓存文件。

顺便说一句,待机列表几乎完全由从硬盘缓存到 RAM 的文件组成。碎片整理后检查缓存或读取 200GB 音乐收藏,同样不会有剩余的可用内存。:)

OP,如果你愿意的话,我可以发送一些测试游戏和其他应用程序的截图/结果/结论以及注释等。大概有 8-9 款游戏出现在一半的平台上......请告诉我。

PS:以上所有内容都是我根据记忆写的,因为所有的测试工作都发生在4-5年前,所以我提出的几个小观点可能(但愿不是)与引用来源中所写的并不完全一致。

还有一件事我忘了提,那就是你关于空闲内存和可用内存的问题。可用内存和空闲内存之间有很大区别——我会在有时间的时候更深入地介绍这一点。但请放心,如果运行内存密集型程序(如 Skyrim)且安装了约 25GB 的模组,则没有空闲内存将导致严重的性能下降。对于工作集,64 位进程限制为 8GB,但该进程可用的总地址空间为 8TB。这称为节对象,这就是 AWE 的工作方式。

分页仍然会发生,但完全发生在 RAM 中(我相信使用指针)。每当引用备用列表中的页面时,就会发生页面错误,这就是在没有 PF 的情况下发生页面错误的原因。

如果引用的页面位于待机列表中,则会发生页面错误,而 HDD 或 RAM 上的实际位置实际上并不包含在内......

此外,对于已禁用的页面文件,没有虚拟地址空间 - 只有地址空间。指针仍在使用,但始终指向实际内存地址(理想情况下,但并非总是如此),并且提交限制与已安装的 RAM 相同。:)

答案2

不幸的是,互联网上对此类问题的答案都是错误的。如果您看到任何答案没有指出已分配内存和正在使用的 RAM 之间的差异,那么该答案就是完全错误的。任何数量的可用 RAM 都可能产生此内存警告。您可以在互联网上看到人们收到低内存警告的报告,即使他们有大量可用 RAM。

低内存警告与可用 RAM 数量无关。您可以拥有大量可用 RAM,但仍会收到低内存警告,因为这些 RAM 是(间接)保留的,用于支持已进行但尚未使用的 RAM 的分配,不能用于支持后续分配。

例如,假设您有一台 Windows 8.1 x64 计算机,该计算机具有 16GB 的物理 RAM 且没有页面文件。然后假设您运行一个分配了 15GB 但尚未使用任何内存的程序。如果操作系统允许分配,它将开始发出虚拟内存不足警告(因为它无法允许成功分配备用内存),即使几乎所有 16GB 的 RAM 仍是空闲的。

您必须非常小心地将使用的 RAM 与虚拟内存的分配请求分开。

当 Windows 可能需要失败的虚拟内存分配(可能需要后备存储)时,它会向您发出内存不足警告。无论系统有多少可用 RAM,都可能发生这种情况,因为 RAM 可能会因先前的分配(也可能需要后备存储)而受到限制。

例如,如果您执行 8GB 的​​正常内存分配但尚未触及该分配,则该分配实际上尚未使用任何 RAM。但是如果您没有页面文件,8GB 的​​可用 RAM 现在有一个限制,即它们必须保持可丢弃,以便以后在需要时可用于支持该分配。

实际上,RAM 就像银行里的钱,而内存分配就像支票。银行里可能还剩下很多钱,但您可能无法再开支票,因为人们可能会兑现您已经开出的支票。无论银行里还剩多少钱,人们都无法购买任何东西。(在这个比喻中,页面文件就像信用额度。)

不可能用问题中那样简单的术语来理解 Windows 上的内存工作原理。您必须了解分配内存和使用 RAM 之间的区别。

也就是说,存在某个阈值(可能是总 RAM 的一小部分)会触发此警告。但这与可用 RAM 是否低于该阈值无关。

相关内容