我遇到的一个问题是,如果我的系统运行几天而没有重新启动,我就会开始收到警告“关闭程序以防止信息丢失”,然后出现一个对话框建议我关闭程序,我可以取消或点击“关闭程序”,Windows 将强制关闭对话框中列出的部分或全部应用程序。
我打开任务管理器,发现目前只使用了大约 30% 的内存:
当我打开资源监视器查看特定应用程序使用了多少已提交的内存时,我仍然看到相对较低的内存使用率:
我遇到这个问题已经有一段时间了,一直在努力寻找解决方案。我使用poolmon调查了驱动程序泄漏等原因,但从未在poolmon中看到任何与其他人描述的驱动程序内存泄漏危险信号相匹配的东西。让我特别困惑的是,为什么当我只使用了33%的系统内存时,Win10会告诉我关闭应用程序。
答案1
此处仅作猜测。
您已禁用交换文件,按照某人的随机“优化”建议。
您有某种操作系统驱动程序需要一大块连续的物理 RAM。但它无法获得它,因为所有物理 RAM 都随着时间的推移而变得支离破碎。而且由于交换文件被禁用,它无法进行 RAM 碎片整理。
启用您的交换文件。
正如我所说,这只是猜测。
答案2
关于您的最后一个问题 - 简短版本:错误消息与“已提交”虚拟地址空间有关。如果您查看第二个屏幕快照中的提交费用图表,您将看到它确实处于或非常接近极限。
“空闲”、“可用”或“正在使用”的 RAM 数量并不重要。特别是,“可用”RAM 不足绝对不是出现“内存不足”或“内存不足”消息的原因。
提交限制等于总 RAM + 页面文件大小。分配已提交的内存后,即使尚未实际使用,也会立即将其计入“提交费用”……这意味着不会立即使用任何 RAM 或 PF 空间。物理空间(无论是 RAM 还是页面文件)仅在实际引用内存时使用。从那时起,它必须有地方存放,直到程序释放它,或者整个过程结束。
示例:假设您没有页面文件,因此您的提交限制为 16 GB(您的 RAM 大小)。现在,假设 8 个进程每个都尝试 VirtualAlloc(MEM_COMMIT) 1 GB。结果:提交费用增加了 8 GB。但是,这不会立即影响 RAM!这就像您在文具店买了一叠纸,但实际上并没有拿到任何纸。但是,每次您需要一张新纸时,就会神奇地出现一张。直到您用完整个叠纸(分配区域的大小)。
现在假设每个进程实际上只访问其 1 GB 内存中的 100 MB。使用的 RAM 仅为 800 MB。
但由于他们每个人可能引用其全部 1 GB,操作系统必须确保 8 GB 的 RAM+页面文件空间……好吧,在没有页面文件的情况下只是 RAM……以防万一。回到文具店,他们需要保留足够的纸张库存,以便为每个人提供他们之前购买的纸张数量。
因此,当当前提交的数量达到限制时,操作系统必须停止允许 VirtualAlloc(MEM_COMMIT) 成功。
为什么?因为进程需要检查 VirtualAlloc 的结果以查看它是否成功。一旦它这样做了并且发现分配成功,进程就有充分的理由期望它对整个已提交区域的后续引用都会成功。
如果 Windows 允许提交费用超过可用空间量,那么该期望就无法始终得到满足。
一种快速的解决方法是增加页面文件的默认(=初始)大小。从上面的解释中,您应该能够明白为什么这可以避免错误消息即使该文件中可能没有任何内容被写入再次,操作系统确保所有提交费用的空间可用以防万一。当进程分配已提交的内存时,它们只是说“嘿,操作系统,我可能需要这么多。”但这并不意味着他们真的会使用它,当然也不意味着他们已经真正使用过它了。
有关详细信息,请参阅我的答案在这里。
现在....为什么当您的进程似乎无法达到要求时,您使用了那么多提交,这是另一个问题。要开始查看,请显示任务管理器的“性能”选项卡,“内存”部分。
答案3
另一种可能性是,您使用的是 32 位 Win10,而不是 64 位。虽然您安装了 16GB 的 RAM,但 32 位操作系统存在限制,使得 4GB 以上的实际使用效果不佳。此外,操作系统会对每个进程可以请求的 RAM 数量施加硬性限制,而不管物理 RAM 是多少。如果是这种情况,除了切换到 64 位操作系统或同时运行更少的应用程序之外,您无能为力。