Windows 10 内存泄漏

Shy*_*Guy 4 memory memory-leaks windows-10

我在 Windows 10 上遇到内存泄漏问题大约一年了,但我现在真的很想解决这个问题,因为它对我的工作产生了相当大的影响。

从下图可以看出,我有 8GB 的​​内存。即使应用程序不超过 1GB,它的 92% 也在使用中。

我去年从 64 位 Windows 7 Pro 升级到了 Windows 10。

询问更多细节,我不知道还能提供什么。我不知道是什么原因造成的。

细节

mag*_*981 10

1 很大一部分高内存使用量 (2GB) 来自高页表使用量。

在此处输入图片说明

要查看哪些进程使用它,安装Windows Performance Toolkit是Windows 10 SDK的一部分,打开命令提示符作为管理员,运行以下命令:

wpr.exe -start ReferenceSet -filemode && timeout 5 && wpr.exe -stop C:\MemUsage.etl
Run Code Online (Sandbox Code Playgroud)

MemUsage.etl用Windows Performance Analyzer(WPA.exe)打开,展开内存项

在此处输入图片说明

将图形ResidentSet从左侧图形列表拖放到分析窗格中:

在此处输入图片说明

现在将Page Category列移动到左侧并展开Page Table条目:

在此处输入图片说明

在这里您可以看到具有高分页表使用率的进程。在右侧站点(在蓝线之后),您会看到每个进程的页表内存使用量(以 MB 为单位)。

此外,合并的(非)分页池使用量接近 2GB。

安装 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 上的屏幕截图,属于 Windows 功能的 4 个标签(VoSM、FILE、Ntfx 和 Proc)。

将此文本复制/粘贴到新的 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>
Run Code Online (Sandbox Code Playgroud)

现在运行wpr.exe -start C:\PoolTagLeak.wprp && timeout 600 && wpr.exe -stop C:\PoolusageUsage.etl并尝试重现使用增长。

将 拖放Pool Graph到分析窗格,将列排序为TypePooltagStack

在此处输入图片说明

现在转到 AIFO(内部分配,外部释放,因此这可能是泄漏),找到您的 4 个标签并展开堆栈以查看此标签使用哪些函数。根据函数的名称,您可以看到“原因”。在我的演示中,Thre标签 (Thread) 被 G-Data 的 AVKCl.exe 使用,因为它启动了很多线程。寻找驱动程序/程序更新来修复它。