答案1
1 很大一部分高内存使用量(2GB)来自高页表用法。
要查看哪些进程使用它,请安装Windows Performance Toolkit
哪个是 Windows 10 SDK 的一部分,以管理员身份打开命令提示符并运行以下命令:
wpr.exe -start ReferenceSet -filemode && timeout 5 && wpr.exe -stop C:\MemUsage.etl
使用Windows Performance Analyzer(WPA.exe)打开MemUsage.etl
,展开内存条目
将图表从左侧图表列表拖放ResidentSet
到分析窗格:
现在将Page Category
列移到左侧并展开Page Table
条目:
这里您可以看到页表使用率较高的进程。在右侧(蓝线之后),您可以看到每个进程的页表内存使用率(以 MB 为单位)。
此外,组合的(非)分页池使用量接近 2GB。
安装 WDKInstall the WDK,运行poolmon
(C:\Program Files (x86)\Windows Kits\10\Tools\x64\poolmon.exe
),通过池类型对数据进行排序,P以便非分页/下次分页位于顶部,并通过B字节后查看使用最多内存的标签。
现在查看哪个pooltag使用了最多的内存,如下所示:
现在打开 cmd 提示符并运行 findstr 命令。为此,打开 cmd 提示符并输入“cd C:\Windows\System32\drivers”(不带引号)。然后输入“findstr /s __。",其中 __ 是标签(poolmon 中最左边的名称)。执行此操作以查看哪个驱动程序使用此标签:
现在,转到驱动程序文件夹 ( C:\Windows\System32\drivers
) 并右键单击有问题的驱动程序(intmsd.sys
如上图示例所示)。单击属性,转到选项details
卡以查找产品名称。查找该产品的更新。
解决这两个问题可以恢复近 4GB 的空间。
根据您在 stackoverflow 上的屏幕截图,4 个标签(VoSM、FILE、Ntfx 和 Proc)属于 Windows 功能。
将此文本复制/粘贴到新的 txt 文件并将其重命名为PoolTagLeak.wprp
<?xml version="1.0" encoding="utf-8"?>
<WindowsPerformanceRecorder Version="1.0" Author="MagicAndre1981" Copyright="MagicAndre1981" Company="MagicAndre1981">
<Profiles>
<SystemCollector Id="SystemCollector" Name="NT Kernel Logger">
<BufferSize Value="1024" />
<Buffers Value="1024" />
</SystemCollector>
<SystemProvider Id="SystemProvider">
<Keywords>
<Keyword Value="Pool" />
</Keywords>
<Stacks>
<Stack Value="PoolAllocation" />
<Stack Value="PoolAllocationSession" />
</Stacks>
<PoolTags>
<PoolTag Value="VoSM"/>
<PoolTag Value="File"/>
<PoolTag Value="Ntfx"/>
<PoolTag Value="Proc"/>
</PoolTags>
</SystemProvider>
<Profile Id="PoolUsage.Verbose.File" Name="PoolUsage" Description="Pool usage Tag 'Leak' " LoggingMode="File" DetailLevel="Verbose">
<Collectors>
<SystemCollectorId Value="SystemCollector">
<SystemProviderId Value="SystemProvider" />
</SystemCollectorId>
</Collectors>
</Profile>
<Profile Id="PoolUsage.Verbose.Memory" Name="PoolUsage" Description="Pool usage Tag 'Leak'" Base="PoolUsage.Verbose.File" LoggingMode="Memory" DetailLevel="Verbose" />
</Profiles>
</WindowsPerformanceRecorder>
现在运行wpr.exe -start C:\PoolTagLeak.wprp && timeout 600 && wpr.exe -stop C:\PoolusageUsage.etl
并尝试重现使用量的增长。
将 拖放Pool Graph
到分析窗格,将列排序为Type
、Pooltag
、Stack
。
现在转到 AIFO(内部分配,外部释放,因此这可能是泄漏),找到您的 4 个标签并展开堆栈以查看此标签使用哪些函数。根据函数的名称,您可以看到“原因”。在我的演示中,Thre
G-Data 的 AVKCl.exe 使用标签(线程),因为它启动了很多线程。查找驱动程序/程序更新以修复它。