我有足够的可用内存时的Windows 10内存不足警告


25

我遇到了一个问题,如果我的系统在不重启的情况下启动了几天,我将开始收到警告,提示“关闭程序以防止信息丢失”,然后出现对话框提示我关闭程序,可以取消或单击该程序“关闭程序”和Windows将强制关闭对话框中列出的部分或全部应用程序。

我打开任务管理器,发现当前只有大约30%的内存正在使用:

利用率33%

当我打开资源监视器以查看特定应用程序正在使用多少已提交内存时,我仍然看到内存使用率相对较低:

资源监控器

我遇到这个问题已有一段时间了,一直在努力寻找解决方案。我已经通过使用poolmon调查了导致驱动程序泄漏的原因,但从未在poolmon中看到任何与其他人描述的驱动程序内存泄漏的危险信号相匹配的东西。让我特别困惑的是,当我仅使用33%的系统内存时,为什么Win10告诉我关闭应用程序。


3
尝试转到任务管理器,然后转到性能选项卡。什么是提交的内存秀场?
DrZoo '16

我没有为此保存屏幕截图,但我的承诺内存占用了很高的可用内存,例如17.5gb / 19gb。
布兰登

Answers:


15

疯狂的猜测在这里。

您已按照某人的随机“优化”建议禁用了交换文件。

您有某种需要大量连续物理RAM的OS驱动程序。但这无法实现,因为随着时间的流逝,所有物理RAM都已碎片化。并且由于禁用了交换文件,因此无法对RAM进行碎片整理。

启用您的交换文件。

就像我说的那样,大胆猜测。


好吧,我设置的页面文件大小最大为3gb。这是交换文件的意思,还是Windows 10中的一个单独管理的东西?并非不可能,我会做这样的事情,当我在10/2015初次建造这台机器并尝试禁用核心停车来修复它时,我遇到了非常糟糕的性能问题。最终,有一个电源管理方案将我的电源降低到了10%,并使所有组件都饿死了,这就是为什么我遇到系统性能问题,但是有可能我在那一集里做了您所说的事情。
布兰登

1
将您的页面文件大小更改为“系统托管”,您的问题可能会消失。
Scott Chamberlain

我曾经对它进行过系统管理,但仍然遇到同样的问题,这需要更长的时间才能显现出来。当我将其设置为系统管理的页面文件时,我认为最大为64gb,然后,当提交的数量真的很高时,我仍然会收到相同的内存不足警告。但是我仍然会看到70%左右的物理内存可用,并且在Resource Monitor中没有迹象表明当前有60 + GB以上的内存已提交给任何列出的进程。
布兰登

我完全同意Zan和Scott的观点,这是导致此问题的页面文件(请参见windowsitpro.com/windows-10/…以获取其他来源的说法)。将其设置为系统管理,如果问题再次出现,则开始调查。
Ƭᴇcʜιᴇ007

因此,我认为系统托管的页面文件是此处的核心答案。在Windows 10环境中,将其设置为静态3gb似乎并不理想。我在几周前实施了此解决方案,并使其在正常使用情况下运行只是为了看看发生了什么,尽管我仍然看到比“资源监视器”的“已落实的内存”列中所占的内存更多,但我并没有遇到内存不足的问题警告或问题。
布兰登

14

关于您的最后一个问题-简短版本:错误消息是关于“已提交”虚拟地址空间的。如果您在第二个屏幕快照中查看“提交费用”图,您会发现它确实达到或非常接近限制。

“可用”,“可用”或“正在使用”的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允许提交费用超过可用于实现该空间的可用空间量,则无法始终满足该期望。

一种快速的解决方法是增加页面文件的默认大小(初始值)。从上面的解释中,您应该能够理解为什么即使没有任何内容写入该文件,也可以避免出现错误消息。再次,OS确保在需要时可用于所有提交费用的空间。当进程分配已分配的内存时,它们只是在说:“嘿,操作系统,我可能需要这么多。” 这并不意味着他们会实际使用它,当然也不意味着他们实际上已经在使用它。

有关更多信息,请参见此处

现在... 为什么您的进程似乎没有加起来时要使用那么多的提交,这是另一个问题。要开始查看,请显示任务管理器的“性能”选项卡的“内存”部分。


我无话可说来描述这样一个完美的答案。谢谢。
Vinicius Tavares

-2

另一种可能性是您使用的是Win10 32位而非64位。当您安装了16GB的RAM时,存在32位操作系统的限制,这些限制在4个以上的缺陷上可以实际使用。此外,无论物理RAM大小如何,操作系统都会对每个请求的RAM数量施加严格限制。在这种情况下,除了切换到64位操作系统或同时运行更少的应用程序外,您无能为力。


2
不能运行32位Win10并让任务管理器显示总共16 GB的内存,就像在OQ中一样。顺便说一句,每个进程的限制是操作系统构成​​的是虚拟内存,而不是RAM。您无法在Windows中进行任何调用来分配RAM 本身。(好吧,AWE,但是它具有管理员级别的特权,除了一些系统程序,几乎没有其他使用。)您分配了虚拟地址空间(例如,使用VirtualAlloc),然后使用它;当您使用它时,操作系统将RAM分配给您的进程(“请求分页”)。但是,当然不是所有的功能都必须一次在RAM中实现。
Jamie Hanrahan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.