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


73

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

在此处输入图片说明

所有用户的所有流程

在此处输入图片说明


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

在此处输入图片说明


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

在此处输入图片说明


3
首先,您只有12GB。您的四个4GB记忆棒中的一个坏或位置不好,或者您的主板不支持16GB。其次,您是否尝试过运行任何安全程序来检查恶意软件?Security Essentials是内置的,因此请确保更新其定义并运行扫描。还请尝试一些反rootkit程序,因为rootkit会特别隐藏(尽管它们通常也试图保持低调以免被注意,并且几乎不会混用几GB的RAM)。
Synetech

你可能想看看性能- >资源监视器
中级野人

尝试运行tasklist命令,将其输出重定向到文件C:\ blah> tasklist> aa,然后打开文件aa,您会看到每个进程的总数,例如15,100K,在其后删除K,然后用Excel对总数求和。查看总数是否与任务管理器为您提供的已使用图形相近。对我来说,任务列表的总容量为4GB,任务管理器说为4.5GB。我无法解释我的差异,但是差异并不大。如果您之间有很大差异,那将很有趣。
barlop

我没有Excel
Vader

1
NDxx标记为ndis.sys。我猜BRCM是Broadcom。那将指出您的网络适配器是问题所在。
大卫·马歇尔

Answers:


82

您有驱动程序引起的内存泄漏。查看非分页内核内存的高价值。您的情况是3.7 GB以上。您可以使用poolmon查看哪个驱动程序导致了高使用率。

安装Windows WDK,运行poolmon,通过P在pool type之后对它进行排序,以便非分页位于顶部,并B在afterbytes 之后,以查看使用最多内存的标记。通过转到WDK的安装文件夹来运行poolmon,转到“工具”(或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-在PROC_THREAD + LOADER + POOL -stackwalk PoolAlloc + PoolFree + PoolAllocSession + PoolFreeSession -BufferSize 2048 -MaxFile 1024 -FileMode循环&&超时-1 && xperf -d C:\ pool.etl

捕获30 -60秒的生长时间。使用WPA.exe打开ETL,将“池”图添加到分析窗格中。

将pooltag列放在第一位,然后添加stack列。现在,将符号加载到 WPA.exe中,并扩展您在poolmon中看到的标签的堆栈。

在此处输入图片说明

现在,您可以在堆栈中找到其他第三方驱动程序。此处,Thre标签(Thread)由G-Data的AVKCl.exe使用。寻找驱动程序/程序更新以对其进行修复。


1
哦对不起。@Jebediah Kerman您是否运行findstr命令?从名称来看,它可能与网卡驱动程序有关。如果仍然有问题,请运行RAMMap,将数据存储为RMP,压缩RMP文件并上传zip。
magicandre1981

这听起来可能很愚蠢。但是我如何开始普尔蒙。我曾经能够搜索“ poolmon.exe”并启动
Vader

@JebediahKerman我想您已经这样做并找到了标签。您发帖中的图片不是您的poolmon吗?
magicandre1981

图片是我的。由于某种原因,搜索索引不完整。
维达

@JebediahKerman你看过这个NDFT是什么吗?您还可以使用xperf跟踪池用法:channel9.msdn.com/Shows/Defrag-Tools/...
magicandre1981

15

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


通过右键单击列标题,然后选择选择列,可以在任务管理器中启用一些其他列。您应该添加Working Set (private)Working Set (shared)Commit,和NP Pool。我会仔细检查所有用户的所有进程,看是否有一个NP Pool超过256KB。如果您发现任何问题,尤其是那些更高的问题,则可能是问题的根源,或者至少是部分问题。

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

非页面缓冲池是无法(也永远不会)从物理内存中交换出来的内存...实际上是永久性的最小物理内存使用量。NP池内存通常包含程序代码和关键部分,必须在物理内存中才能正确或安全地运行它们,特殊堆等。在60个进程中,如果所有进程都具有256KB NP池内存,则您的绝对最低物理内存使用量大约为15,360KB。在大多数情况下,一个或两个应用程序可能具有256KB NP池,而大多数应用程序具有更少,经常更少(或没有)。系统极不可能将所有进程工作集的全部页面调出,因此永远不要期望内存使用率会降低。


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

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

如果一个进程需要的内存多于允许访问的内存(使用增强技术,32位进程通常可以访问2Gb,有些则少于4Gb,而每个64bit进程通常可以访问大约48Gb的内存),则Windows有时会尝试使用交换空间虚拟化其内存。如果32位应用程序要使用其允许的最大2Gb空间,但只有1.2Gb可用,则Windows将在页面文件中保留完整的2Gb,并根据需要将进程自己的数据移入和移出页面文件,以便支持应用程序的内存使用情况。在进行“总提交”时,这种情况下的总“内存”使用量似乎大于可用的物理内存。总提交通常以页面文件的总大小最大,在由系统管理时,通常为物理内存量的2-3倍。就你而言


最后一点。您在回答中说您拥有16Gb RAM,而“任务管理器”仅看到12Gb RAM。这里有两件事之一。您的系统实际上只只有12Gb的RAM,或者您的一根摇杆未正确注册。如果有一根公羊棍(我假设是4个4Gb棍),则可能是坏的,可能无法完全正确地放置在您的主板中,或者您的主板可能存在内存检测问题。

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


有趣..我只是注意到他的非分页内存非常大..mine是539MB已分页,139MB未分页。您显然比我了解更多。.但是,您在完全提交上错了。写“总提交通常将达到最大的总页面文件大小”我的RAM是12GB。我将我的页面文件设置为最小4000MB(3.8GB?),最大设置为1.5-2x内存。我的最大提交是15GB(commit = 7 / 15当前),我的页面文件大约为4GB或可能比3.8GB少一些。最大提交更像页面文件大小+ RAM大小。当我的页面文件为12GB时,我的最大提交约为24GB。页面文件几乎
3.8GB

@barlop:嗯,您有点误解了什么是提交。从技术上讲,提交费用是总的“虚拟可寻址内存空间”,包括扩展内存管理器支持的空间和大型地址意识。最大提交数不是页面文件+ RAM,而是将其描述为系统管理的虚拟地址总空间。页面文件通常至少应涵盖总的物理内存大小,并将其扩展到超过总的物理内存大小。在您的情况下,我希望提交的数据至少为18Gb(1.5x)或24Gb(2x),但是……
jrista 2013年

...系统管理的页面文件就是这种情况。听起来您已经手动调整了页面文件的设置,在这种情况下,我将不得不进一步了解您的特定配置,以告诉您为什么当前的提交是15Gb(因为3.8 / 4Gb页面文件将指示16Gb的提交,而不是15Gb的提交) 。)完全没有可能手动配置任何页面文件,或者页面文件太小,这可能导致奇怪的性能问题和内存分配问题。除非您具有高度特定的服务器(即数据库)设置,否则最好的建议是允许Windows管理其页面文件。
jrista

最后一点。为了获得最佳性能,最好让Windows提前分配最大页面文件大小。这通常是在SQL Server数据库之类的服务器设置上完成的,您可以在其中为页面文件预分配64Gb或更多(通常是物理内存大小的2倍,甚至可能是128Gb或256Gb),以便在多个物理磁盘之间平均分配页面文件以获得最佳性能。 。分布式页面文件(尤其是在预先分配为最大大小时)允许在所有参与的磁盘上进行交错的读/写,因此可以通过并行I / O改善分页性能。
jrista

作为繁重的内存负载的示例,我的系统当前具有:7.5 / 12Gb物理内存使用率;14.7 / 23.3Gb提交; 491mb页面缓冲池;145mb np池。这用于146个进程,最大页面缓冲池2276k,最大np池263k。最大提交大小696,396k,对于同一进程,WS是714,256k(Opera选项卡进程。)(我的高进程数是由于Web浏览器...这些天,它们通过进程隔离了选项卡,我是一个hypertabber ...数十个同时打开,因此还有数十个其他过程。)
jrista 2013年

12

我如何找出为什么我的Windows使用如此多的RAM。

它使用了如此多的RAM,因为它是设计用来这样做的。使用RAM绝对没有成本。实际上,使用的RAM优于可用的RAM,因为操作系统无需执行任何操作即可使用它。使用空闲RAM需要使用它,这需要付出很多努力。

如果您在考虑“我现在希望释放RAM,以便以后使用”,请不要理会。RAM不必立即释放以供以后使用。现在,您可以使用它,并在以后使用它。这里没有权衡取舍-使用RAM绝对没有缺点。

RAM保持使用状态,可以直接从一种用途切换到另一种用途,而不必费心去释放它,而只需要再次使用它。现代操作系统只有在别无选择时才会释放RAM。


12
如果我的Windows 7系统在启动时使用的是3gb的ram,而没有打开任何应用,那一定是错误的
Vader

5
@JebediahKerman为什么这么说?我花了一些力气试图向您解释为什么不是这种情况,以及为什么Windows旨在这样做。你不明白我的解释吗?或者,如果您不同意,可以解释您认为我错了的地方吗?
David Schwartz

11
@DavidSchwartz的答案完全错误。他的驾驶员发生了内存泄漏
magicandre1981

9
@DavidSchwartz:您描述的行为(可重复使用的RAM分配)必须从可分页内存中进行。令人担忧的数字是1.3 GB的非分页内存。您不能仅仅将其释放用于其他资源,那1.3 GB的字节又将流向何方?被“非分页”意味着拥有者说“这些字节非常重要,您甚至不能将它们放在磁盘上,更不用说丢弃它们了”。
MSalters

25
为什么这个“答案”被投票得如此之高?它完全错了重点。不管使用什么特定的词(一开始就很清楚),问题不是“Why is Windows using RAM?”,问题是:“Why do the RAM usage numbers not add up; why is one part reporting a higher usage than another part?”此帖子充其量应该是评论,因为它没有解决实际的问题,甚至没有尝试回答它。这样做只会带来一些建议,而糟糕的建议是,因为如果OP按照建议忽略了它,则不会发现内存泄漏。
Synetech

2

上面未提及的原因是Hyper-V。

我能够通过出色的实用程序RamMap识别它:

在此处输入图片说明

屏幕截图来自之后。在“ Driver Locked”内存超过6GB之前,此特定计算机中的RAM超过80%。我必须进入Hyper-V管理器并禁用“动态内存”。奇怪的是,即使在重新启用它之后,“ Driver Locked”内存仍然很低-我只能假定以前的实例增加了它,而Hyper-V不会自动减少其分配的内存:

在此处输入图片说明

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.