Windows 使用过多 RAM,如何诊断资源占用

Vad*_*der 80 memory windows windows-7 task-manager memory-leaks

我有 16GB 的系统内存。启动时除了任务管理器外没有打开任何应用程序 Windows 使用大约 3GB 的 RAM。我查看了进程选项卡,但似乎没有任何异常。如何找出我的 Windows 使用如此多 RAM 的原因。

在此处输入图片说明

来自所有用户的所有进程

在此处输入图片说明


从 poolmon 中读取似乎我的无线 Broadcom 驱动程序使用了大约 0.4GB 的 RAM。即使我删除它,它仍然会在启动时使用 2.6GB,这仍然太多了。

在此处输入图片说明


重新安装与内存泄漏相关的无线驱动程序后。我有一个新的屏幕截图,想确认它确实是内存泄漏。

在此处输入图片说明

mag*_*981 91

您有由驱动程序引起的内存泄漏。看看非分页内核内存的高价值。在您的情况下,这超过 3.7 GB。您可以使用poolmon查看导致高使用率的驱动程序。

安装Windows WDK,运行 poolmon,通过P后池类型对其进行排序,以便非分页位于顶部,并通过B后字节查看使用最多内存的标记。通过转到安装 WDK 的文件夹运行 poolmon,转到 Tools(或 C:\Program Files (x86)\Windows Kits\10\Tools\x64)并单击 poolmon.exe。

现在看看哪个 pooltag 使用的内存最多,如下所示:

在此处输入图片说明

现在打开一个 cmd 提示符并运行 findstr 命令。为此,请打开 cmd 提示符并键入“cd C:\Windows\System32\drivers”,不带引号。然后键入“findstr /s __ . ”,其中 __ 是标签(poolmon 中最左边的名称)。执行此操作以查看哪个驱动程序使用此标签:

在此处输入图片说明

现在,转到驱动程序文件夹(C:\Windows\System32\drivers)并右键单击有问题的驱动程序(上图示例中的 intmsd.sys)。单击属性,转到详细信息选项卡以查找产品名称。寻找该产品的更新。

如果 pooltag 仅显示 Windows 驱动程序或列在 pooltag.txt ( "C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x64\triage\pooltag.txt")

您已使用xperf 来跟踪导致使用的原因从 Windows SDK安装WPT以管理员身份打开cmd.exe并运行:

xperf -on PROC_THREAD+LOADER+POOL -stackwalk PoolAlloc+PoolFree+PoolAllocSession+PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode Circular && timeout -1 && xperf -d C:\pool.etl

捕获 30 -60 年代的增长。使用 WPA.exe 打开 ETL,将池图添加到分析窗格。

将 pooltag 列放在第一位并添加堆栈列。现在加载WPA.exe 中的符号并展开您在 poolmon 中看到的标记堆栈。

在此处输入图片说明

现在找到您可以在堆栈中看到的其他 3rd 方驱动程序。这里的Thre标签 (Thread) 被 G-Data 的 AVKCl.exe 使用。寻找驱动程序/程序更新来修复它。


jri*_*sta 17

好吧,首先,在我进入更详细的答案之前。在您的第一个屏幕截图中,您的非分页池(一种内核内存使用)为 1.3GB。这对我来说似乎异常高,尤其是在启动后仅 30 分钟。我想我可以看到 NP Pool 在长时间使用或使用像筛子一样泄漏的程序后变得如此之高。相比之下,我的 NP 池通常在 100 到 200 兆字节之间,而我的分页池可能高达 400 或 500(这是在我的系统运行数周而没有重新启动之后)。


您可以通过右键单击列标题并选择选择列来启用任务管理器中的一些附加列。您应该添加Working Set (private)Working Set (shared)Commit,和NP Pool。我会扫描所有用户的所有进程,看看他们中是否有超过 256KB 的 NP 池。如果你看到任何,尤其是那些明显更高的,那可能是问题的根源,或者至少是问题的一部分。

您的总工作集,即进程使用的物理内存量,是私有工作集和共享工作集 (WS) 的组合。对于大多数进程来说,私有通常更大,但是可能有一些使用大量共享 WS。这两者的总和通常应为总 WS。Commit 是已提交给后备存储(在大多数情况下为 Windows 页面文件)的工作集数量。后台应用程序通常具有比 WS 更大的 Commit,这表明它们的大部分分页池已被交换出内存并进入您的分页文件(这对于已经最小化且一段时间未使用的桌面应用程序来说非常正常)。

非分页池是不能也永远不会从物理内存中换出的内存……这实际上是您永久的最小物理内存使用量。NP Pool 内存通常包含必须在物理内存中才能正确或安全地运行的程序代码和临界区、特殊堆等。 在 60 个进程中,如果所有进程都有 256KB 的 NP Pool 内存,那么您绝对最小的物理内存使用量大约为 15,360KB。在大多数情况下,一两个应用程序可能有一个 256KB 的 NP 池,而大多数应用程序较少,通常很少(或没有)。系统极不可能将所有进程工作集的整个页面调出,因此永远不要期望内存使用量会变得如此之低。


最后,拥有更多内存的目的是避免将数据分页到物理磁盘上的扩展内存空间(交换、分页文件)和从中分页。分页是一个过程,涉及移动分配的物理内存块,将一些块推送到磁盘,并将其他块从磁盘带入物理内存。为了简单起见,分页是非常不受欢迎的。它本身并不“坏”,但如果它发生得太频繁,它可能会真正拖累性能。增加系统中总物理 RAM 的最终目的是允许更多进程将更多提交保留在物理内存(更大的工作集)中。消耗内存不是问题,当更多执行进程使用更多内存时,系统总性能和活动进程性能通常会更高,

Windows 为您管理内存,并自动为您将内存中的数据分页进出页面(交换)文件。如果你运行一个需要 9GB 内存的进程,而你的系统已经使用了 4GB(12GB 中的),那么系统会自动找出哪些进程不需要立即访问它们的整个工作集,它会分页一些或全部他们的分页池中的一部分进行交换以释放额外的 1GB。如果你的大进程最终需要更多内存,windows 将进一步减少其他进程的工作集,直到它有足够的空闲空间来分配新请求的块。您的大型进程最终可能会消耗除 NP Pool 之外的所有可用内存,并且可能会因定期执行不允许 Windows 释放更多工作集的进程而产生一些额外的最小开销(即。e. 它们有待处理的页面错误,否则 Windows 会换出物理内存,但由于它们是被请求的,因此无法移动。)

如果一个进程需要的内存超过其允许访问的内存(32 位进程通常可以访问 2Gb,有些使用增强技术可以访问略小于 4Gb,而 64 位进程通常可以访问大约 48Gb 的内存,每个),那么 windows 有时会尝试用交换空间虚拟化它的内存。如果 32 位应用程序想要使用其最大允许的 2Gb 空间,但只有 1.2Gb 可用,Windows 将在页面文件中保留完整的 2Gb,并根据需要将进程自己的数据移入和移出页面文件,以便支持应用程序的内存使用。在这种情况下,总“内存”使用量可能看起来大于可用物理内存,当通过 Total Commit 进行时。Total Commit 通常会在总页面文件大小上达到最大值,当由系统管理时,通常是物理内存量的 2-3 倍。在你的情况下,


最后一点。您在回答中说您有 16Gb 的 RAM,而任务管理器只能看到 12Gb 的 RAM。这里有两件事之一。要么您的系统确实只有 12Gb 的 RAM,要么您的一根棍子没有正确注册。如果是一根内存条(我假设是 4x 4Gb 内存条),它可能是坏的,可能没有完全正确地安装在你的主板上,或者你的主板可能有内存检测问题。

要检查是否是后者,您应该首先将主板 BIOS 更新到最新版本。我遇到了类似的问题……我的 6 个三通道 DDR3 内存条(6x 2Gb)都很好,基于对每个内存的单独测试……但是我的主板随机决定不经常计算其中的一两个,经常让我只有 8Gb 的内存。BIOS 更新解决了这个问题,现在我可以可靠地访问所有 12Gb 的内存。


Dav*_*rtz 12

如何找出我的 Windows 使用如此多 RAM 的原因。

它使用了如此多的 RAM,因为它是为这样做而设计的。使用 RAM 绝对没有相关成本。事实上,使用过的 RAM 比空闲 RAM 更好,因为操作系统不需要做任何事情来使用它。使用空闲 RAM 需要使用它,这需要付出努力。

如果你在想“我现在想要我的 RAM 空闲,以便我以后可以使用它”,忘记它。RAM现在不必空闲才能以后使用。现在,您可以使用它,并在以后使用它。这里没有折衷——使用 RAM 绝对没有缺点。

RAM 保持使用状态并直接从一种用途切换到另一种用途,而不必为了再次使用而努力使其免费。现代操作系统只有在别无选择时才会让 RAM 空闲。

  • 为什么这个“答案”的票数如此之高?它**完全**没有抓住重点。不管使用的具体词是什么(一开始就非常清楚),问题不是“为什么 Windows 使用 RAM?”,问题是“为什么 RAM 使用量没有加起来?为什么一个部分报告的使用率高于另一部分?”` 这个帖子充其量应该是一个评论,因为它没有解决实际问题,甚至*试图*回答它;它只提供了一些建议,还有 **坏** 建议,因为如果 OP 按照建议忽略了它,就不会发现内存泄漏。 (26认同)
  • 如果我的 windows7 系统在启动时使用 3gb 内存,没有打开任何应用程序,那么一定有问题 (12认同)
  • @DavidSchwartz 完全错误的答案。他有一个驱动程序的内存泄漏 (11认同)
  • @DavidSchwartz:您描述的行为(可以重用的 RAM 分配)必须由可分页内存构成。令人担忧的数字是 1.3 GB 的非分页内存。你不能只为其他资源释放它,那些 1.3 GB 会去哪里?“非分页”意味着所有者说“这些字节非常重要,您甚至不能将它们放在磁盘上,更不用说丢弃它们”。 (10认同)
  • @JebediahKerman 你为什么这么说?我努力向您解释为什么情况并非如此,以及为什么 Windows 旨在做到这一点。你没看懂我的解释吗?或者,如果你不同意,你能解释一下你认为我错在哪里吗? (5认同)
  • 并不真地; 它[一直](http://superuser.com/posts/674649/revisions)`为什么数字不加起来?`这是一个非常好的问题。高内存使用量只有在需要*考虑使用*时才有意义。OP 无法找到任何使用该内存的内容,因此无法找到问题。您的帖子回答了*高内存使用率是否可​​以*的问题,而不是这个问题,因此它应该是评论,而不是“答案”。 (5认同)
  • 我不知道你从哪里得到你的数字。其任务管理器的“进程”选项卡 [显示](http://superuser.com/revisions/674649/2) 不超过 490MB(50 个可见进程中有 483652 个进程,其余 10 个进程最多 1732 个) ,而“性能”选项卡显示已使用 3.20GB。这是一个很大的差异,会促使任何理智的人想知道为什么 Windows 的一个部分报告的使用量是所有可见的总使用量的 6.7 倍。问其他 2.7GB 分配在哪里是完全合理的。我不知道如何使它更清楚。 (3认同)
  • 事实上,您的链接是关于来宾操作系统中的管理程序、虚拟机和气球驱动程序的,除了 OP 的问题之外,所有这些都与 OP 的问题无关,这只是部分地回答了这个问题。他想看到一些关于额外记忆在哪里的有形数据。即使您所描述的正在发生,任务管理器或进程资源管理器中也应该有某种字段,或者诸如“临时使用”或“要被垃圾收集”之类的内容,或者诸如“2.7GB”之类的内容。您的场景是有道理的(尽管解释得不好),但我们都希望*看到*一个显示为“2.7GB”的字段。 (2认同)