poolmon.exe 是一个内存池监控工具,用于显示 Windows 系统中不同内存池(比如非分页池、分页池)中的对象和其占用的内存,可以帮助开发者进行内存泄漏的排查。

PoolMon - Windows drivers | Microsoft Learn

内存池监视器 PoolMon (poolmon.exe) 显示操作系统从系统分页和非分页内核池以及用于终端服务会话的内存池中收集有关内存分配的数据。 数据按池分配标记进行分组。

驱动程序开发人员和测试人员在创建新驱动程序、更改驱动程序代码或对驱动程序施加压力时,经常使用 PoolMon 来检测内存泄漏。 还可以在每个测试阶段使用 PoolMon 来查看驱动程序的分配和空闲操作模式,并揭示驱动程序在任何给定时间使用了多少池内存。

PoolMon 包含在 Windows 驱动程序工具包 (WDK) 的 \Tools\Other 子目录中。

本主题包括以下内容:

PoolMon 概述

PoolMon 要求

PoolMon 命令

PoolMon 显示

PoolMon 示例

PoolMon 可以显示分配每个池标记的 Windows 组件和常用驱动程序的名称。 此功能使用 pooltag.txt 中的数据,该文件与 PoolMon 和 Windows 调试工具包一起安装。


PoolMon 显示有关内存分配的以下数据。 数据按分配的池标记排序。

  • ) (和未释放内存分配的分配操作和可用操作数。

  • 更新之间分配操作和可用操作数的变化。

  • 按标记分配的总内存大小(以字节为单位)和平均分配大小。

  • 更新之间使用的字节数变化。

  • 分配标记值的驱动程序。

PoolMon 还显示常规内存信息,包括总内存和可用内存、页错误、内核物理内存、已提交的内存和提交限制、峰值内存以及分页和非分页池的大小。

使用 PoolMon,还可以:

  • 在 PoolMon 显示运行时对其进行排序和重新配置。

  • 将配置的数据保存到文件。

  • 生成本地系统上驱动程序使用的标记文件, (仅) 32 位 Windows。


PoolMon 需要以下系统配置、权限和文件。

系统要求

Windows 驱动程序工具包 (WDK) 中包含并在本文档中介绍的 PoolMon 版本仅在 Microsoft Windows XP 和更高版本的 Windows 上运行。

池标记要求

池标记功能收集并计算按分配的标记值排序的池内存的统计信息。

若要启用池标记,请使用 Windows 调试工具中包含的 GFlags 工具。 打开全局标志对话框,选中启用池标记复选框,然后重新启动计算机。

终端服务会话池监视的要求

PoolMon 仅在 Windows Server 2003 及更高版本的 Windows 上显示来自终端服务会话池的分配。

仅当计算机配置为终端服务器时,Windows 才会从终端服务会话池分配内存。 在终端服务器上,Win32 子系统的内核模式部分从会话池分配内存。 否则,Windows 将从系统池为终端服务分配池内存。

显示要求

若要查看整个 PoolMon 显示,命令提示符窗口大小必须至少为 80 个字符(宽度=80),且至少为 53 行高(高度=53),并且命令提示符窗口缓冲区的宽度必须至少为 500 个字符(宽度=500),高度必须至少为 2000 行(高度=2000)。 否则,显示可能会被截断。

所需文件

poolmon.exe

msdis130.dll

msvcp70.dll

msvcr70.dll

pooltag.txt


若要启动 PoolMon,请使用以下语法和参数在命令行中键入命令。

    poolmon [/iTag] [/xTag] [/g [PoolTagFile]] [/s[TSSessionID]] [ /p | /p /p ] [/e] [/( | /)]  [/t | /a| /f| /d | /b| /m] [/l] [/n [File]] [/? | /h] 

参数

/我
仅显示具有指定池标记的分配。 可以在 PoolMon 命令中具有多个 /i 参数。 不要在 /i 和 Tag 参数之间键入空格。

/x
从显示中排除具有指定标记的分配。 可以在 PoolMon 命令中具有多个 /x 参数。 不要在 /x 和 Tag 参数之间键入空格。

标记
指定池标记或池标记模式。 池标记区分大小写。 Tag 参数可以包含一个星号(*)来表示任何字符的零个或多个实例,也可以包含问号()来表示任何字符的一个实例。 不要使用星号开始标记。

/g
向显示(Mapped_Driver)添加一列,其中列出了 Windows 组件和分配每个标记的常用驱动程序。

PoolTagFile
指定格式化文本文件的路径和文件名,其中列出了 Windows 组件的名称以及它们分配的常用驱动程序和标记值。 此文件是使用 /g 参数时显示的Mapped_Driver列的数据源。

默认值为pooltag.txt,Microsoft提供的文件。 windows 驱动程序工具包(WDK)中包括Pooltag.txt。

/s
显示来自终端服务会话池的分配。

TSSessionID
仅显示来自指定会话池的分配。 不要在 /s 参数和 TSSessionID 参数之间键入空格。

/p
仅显示来自非分页池的分配。

/p /p
仅显示分页池中的分配。

/e
显示池总计。 总计显示在显示底部。

/( 或 /)
打开按更改排序模式。 使用 /( 或 /)时,PoolMon 按值(分配、自由操作和字节)中的更改进行排序,而不是值。 每个值的更改显示在值后的括号中。

与 /a、/f、/b 或 /m 一起使用。 例如, poolmon /a 按分配数对显示进行排序,而 poolmon /( /a 按分配数的更改对显示进行排序。

左括号和右括号字符具有相同的效果,可以互换使用。

/t
按标记名称按字母顺序排序。 这是默认情况。

/一个
按分配数对标记进行排序。

/f
按可用操作数对标记进行排序。

/d
按释放的字节分配和字节之间的差异对标记进行排序。

/b
按使用的字节对标记进行排序。

/m
按按分配字节对标记进行排序。

/l
关闭突出显示。 默认情况下,PoolMon 突出显示自上次更新以来已更改的值。

/n
将 PoolMon 输出的快照保存到文件,而不是在命令窗口中显示。 可以包括用于配置输出的其他命令行参数。

由于快照数据是静态的,因此显示 PoolMon 显示值更改的列不会显示在快照文件中。

文件
指定快照文件的名称和位置。 默认值为poolsnap.log。

/?或 /h
显示命令行语法。 /? 和 /h 参数具有相同的效果,可以互换使用。

备注

还可以使用 /g 通过指定具有 poolcom /g 文件名的文件名和位置,在 Mapped_Driver 列中显示来自其他文件的数据。

终端服务会话池监视仅适用于 Windows Server 2003 及更高版本的 Windows。

仅当计算机配置为终端服务器时,Win32 子系统的内核模式部分才从终端服务会话池分配内存。 否则,Windows 将从系统池为终端服务分配池内存。


若要在 PoolMon 运行时更改显示,请使用运行时命令。 每个运行时命令都包含一个键盘字符。 按键执行命令。

    [p] [( | )] [s] [TSSessionID] [i] [l] [e] [t] [a] [f] [d] [b] [m] [h | ?] [q | ESC]

参数

p
通过非分页分配、分页分配以及两者切换显示。


在按值(分配、自由操作和字节)排序和按值更改排序之间切换显示。 可以使用任一括号字符。 它们具有相同的效果。

s
切换系统池和终端服务会话池之间的显示。

TSSessionID
显示来自指定终端服务会话池的分配。 TSSessionID 表示终端服务会话的会话 ID。 它必须是 0 到 9 的整数。 若要显示所有会话池或输入大于 9 的会话 ID,请使用 i 命令。


提示你输入终端服务器会话的会话 ID。 可以通过以下两种方式进行响应:

  • 若要显示来自所有终端服务会话池的分配,请按 Enter。

  • 若要显示来自特定终端服务会话池的分配,请键入会话 ID,然后按 Enter。

l
切换突出显示已更改行的打开和关闭。

e
打开和关闭池总计。 总计显示在显示底部。

t
按标记名称排序。

一个
按分配数进行排序。 与括号字符一起使用时,键按分配中的更改进行排序。

f
按可用操作数进行排序。 与括号字符一起使用时, f 键按自由操作的更改进行排序。

d
按分配的字节和释放的字节之间的差异进行排序。

b
按使用的字节排序。 与括号字符一起使用时, b 键按所用字节的更改进行排序。

m
按每个分配的字节排序。 与括号字符一起使用时, m 键按每分配字节数的更改进行排序。

或 h
显示启动命令参数、运行时命令和 PoolMon 显示的说明。 若要关闭帮助显示,请按 ESC 键。

q 或 ESC
停止 PoolMon。

本主题包括以下 PoolMon 用法示例:

示例 1:显示和排序 PoolMon 输出

示例 2:显示驱动程序名称

示例 3:检测内存泄漏

示例 4:检查池内存泄漏

示例 5:监视终端服务器会话

示例 1:显示和排序 PoolMon 输出

此示例介绍配置 PoolMon 显示的各种方法。 默认情况下,PoolMon 按标记值按字母数字顺序显示所有内核内存分配。 可以在命令行或 PoolMon 运行时修改显示的排序顺序。

以下命令启动 PoolMon:

poolmon

以下命令启动 PoolMon,并按可用操作数对显示进行排序:

poolmon /f

在 poolmon 运行时,可以使用运行时命令更改显示。 例如,若要按使用的字节数对显示进行排序,请按 b。 若要按每个分配的字节数排序,请按 m

以下命令启动 PoolMon,并仅显示来自非分页池的分配:

poolmon /p

在 PoolMon 运行时,按 p 切换分页池和/或非分页池的分配。

若要启动 PoolMon 并显示具有特定标记的分配的数据,请使用 /i 参数。 以下命令显示具有 AfdB 标记的分配 (afd.sys用于数据缓冲区) 的标记。

poolmon /iAfdB

若要排除具有特定标记的分配,请使用 /x 参数。 以下命令显示没有 AfdB 标记的所有分配:

poolmon /xAfdB

可以使用星号 (*) 和/或问号 (?) 指定一组具有相同字符的标记。 以下命令显示具有以 Afd 开头的池标记的分配,该标记由 afd.sys 使用;

poolmon /iAfd*

PoolMon 启动命令可以包含多个 /i 和 /x 参数。 以下命令显示具有以 Aud 开头的标记和以 抄送开头的四个字符标记的分配,但 CcBc 标记的分配除外:

poolmon /iAud* /iCc?? /xCcBc

还可以按更新之间的值更改对 PoolMon 显示进行排序。 / ( 参数将 PoolMon 置于按更改排序模式。

以下命令显示具有以 Afd 开头的标记的分配,并按分配中的更改进行排序。 它使用 /a 参数按分配数排序, 使用 /) 参数按分配数的更改进行排序。

poolmon /iAfd* /( /a

/ ( 参数和括号键是切换开关。 当 PoolMon 处于按更改排序模式时,它将所有排序命令解释为命令,以便按值中的更改进行排序。 如果再次按括号键,它将按值排序。

示例 2:显示驱动程序名称

可以使用 PoolMon /g 参数显示分配每个池标记的 Windows 组件和常用驱动程序的名称。 如果在具有特定标记的分配中发现问题,此功能可帮助你识别有问题的组件或驱动程序。

组件和驱动程序列在“Mapped_Driver”列中,即显示中最右侧的列。 Mapped_Driver列的数据来自 pooltag.txt,这是随 WDK 一起安装的文件。

以下命令显示以 NtF 开头的标记分配的内存。 (它使用问号字符 () 作为通配符) /g 参数添加Mapped_Driver列。

poolmon /iNtF? /g "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\triage\pooltag.txt"

还可以将 pooltag.txt 文件复制到 poolmon 所在的同一位置。 这允许使用此用法。

poolmon /iNtF? /g

生成的显示将列出具有 NtF 开头的标记的分配。 显示中最右侧的列Mapped_Driver显示内存是由 NTFS 文件系统的驱动程序ntfs.sys分配的。 在这种情况下,显示更具体,因为pooltag.txt包含 NTFS 分配的源文件。

 Memory:  260620K Avail:   65152K  PageFlts:    85   InRam Krnl: 2116K P:19560K
 Commit: 237688K Limit: 640916K Peak: 260632K            Pool N: 8500K P:33024K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 NtFA Nonp       9112 (   0)      9112 (   0)     0       0 (     0)      0 [ntfs.sys  -  AttrSup.c]
 NtFB Paged      3996 (   0)      3986 (   0)    10  252088 (     0)  25208 [ntfs.sys  -  BitmpSup.c]
 NtFC Paged   1579279 (   0)   1579269 (   0)    10     640 (     0)     64 [ntfs.sys  -  Create.c]
 NtFD Nonp         13 (   0)        13 (   0)     0       0 (     0)      0 [ntfs.sys  -  DevioSup.c]
 NtFF Paged      1128 (   0)      1128 (   0)     0       0 (     0)      0 [ntfs.sys  -  FileInfo.c]
 NtFI Nonp        152 (   0)       152 (   0)     0       0 (     0)      0 [ntfs.sys  -  IndexSup.c]
 NtFL Nonp      68398 (   0)     68390 (   0)     8   27280 (     0)   3410 [ntfs.sys  -  LogSup.c]
 NtFS Paged      2915 (   0)      2614 (   0)   301   80192 (     0)    266 [ntfs.sys  -  SecurSup.c]
 NtFa Paged       838 (   0)       829 (   0)     9     288 (     0)     32 [ntfs.sys  -  AllocSup.c]
 NtFd Paged    137696 (   0)    137688 (   0)     8     720 (     0)     90 [ntfs.sys  -  DirCtrl.c]
 NtFf Nonp          2 (   0)         1 (   0)     1      40 (     0)     40 [ntfs.sys  -  FsCtrl.c]
 NtFs Nonp      48825 (   0)     47226 (   0)  1599   64536 (     0)     40 [ntfs.sys  -  StrucSup.c]
 NtFv Paged       551 (   0)       551 (   0)     0       0 (     0)      0 [ntfs.sys  -  ViewSup.c]

Pooltag.txt很广泛,但它并不是 Windows 中使用的所有标记的完整列表。 当显示中显示的标记不包含在pooltag.txt中时,PoolMon 会在标记的“Mapped_Driver”列中显示“未知驱动程序”。

以下示例演示 32 位系统上的此方法。

以下命令使用 /i 参数列出以 MEM 结尾的标记的分配。 /g 参数将驱动程序名称从 pooltag.txt 文件添加到显示中。

poolmon /i?MEM /g

生成的显示列出了标记以 MEM 结尾的分配。 但是,由于pooltag.txt中不包含 MEM 标记,因此“未知驱动程序”显示在Mapped_Driver列中,而不是驱动程序名称。

 Tag  Type        Allocs          Frees      Diff   Bytes      Per Alloc    Mapped_Driver

 1MEM Nonp       1 (   0)         0 (   0)     1    3344 (     0)   3344   Unknown Driver
 2MEM Nonp       1 (   0)         0 (   0)     1    3944 (     0)   3944   Unknown Driver
 3MEM Nonp       3 (   0)         0 (   0)     3     248 (     0)     82   Unknown Driver

以下命令启动 PoolMon。 它使用 /i 参数列出标记以 MEM 结尾的分配。

poolmon /i?MEM 

以下命令列出以 Ip 开头的标记的分配。 它使用 /g 参数,该参数使用 Mapped_Driver 列中pooltag.txt文件的内容。

poolmon /iIp* /g

在生成的显示中,Mapped_Driver列包含来自pooltag.txt文件的数据。

 Memory:  130616K Avail:   23692K  PageFlts:   146   InRam Krnl: 2108K P: 9532K
 Commit: 187940K Limit: 318628K Peak: 192000K            Pool N: 8372K P:13384K
 System pool information
 Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

 IpEQ Nonp          1 (   0)         0 (   0)        1    1808 (     0)   1808 [ipsec][ipsec.sys    -  event queue]
 IpFI Nonp         26 (   0)         0 (   0)       26    7408 (     0)    284 [ipsec][ipsec.sys    -  Filter blocks]
 IpHP Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpIO Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec]
 IpLA Nonp          1 (   0)         0 (   0)        1     248 (     0)    248 [ipsec][ipsec.sys    -  lookaside lists]
 IpSH Nonp          1 (   0)         1 (   0)        0       0 (     0)      0 [ipsec.sys    - IP Security]
 IpSI Nonp       1027 (   0)         0 (   0)     1027   53272 (     0)     51 [ipsec][ipsec.sys    - initial allcoations]
 IpTI Nonp          3 (   0)         0 (   0)        3    5400 (     0)   1800 [ipsec][ipsec.sys    -  timers]

示例 3:检测内存泄漏

此示例建议使用 PoolMon 检测内存泄漏的过程。

  1. 使用参数 /p /p 启动 PoolMon (仅显示分页池) 和 /b (按) 字节数排序的分配。

    poolmon /p /p /b
  2. 让 PoolMon 运行几个小时。 由于启动 PoolMon 会更改数据,因此它必须在数据可靠之前重新获得稳定状态。

  3. 将 PoolMon 生成的信息保存为屏幕截图,或者将其从命令窗口复制并粘贴到记事本。

  4. 返回到 PoolMon,按 两次 p 键可仅显示来自非分页池的分配。

  5. 在至少两小时内,大约每半小时重复步骤 3 和 4,每次在分页池和非分页池之间切换。

  6. 数据收集完成后,检查 Diff (分配操作减去自由操作) 和字节 (分配的字节数减去每个标记释放) 值的字节数,并注意任何持续增加的字节数。

  7. 接下来,停止 PoolMon,等待几个小时,然后重启 PoolMon。

  8. 检查正在增加的分配,并确定现在是否释放了字节。 可能的原因是尚未释放或大小继续增加的分配。

示例 4:检查池内存泄漏

以下示例演示如何使用 PoolMon 调查可疑打印机驱动程序的池内存泄漏。 在此示例中,PoolMon 显示 Windows 使用 Dsrd 标记收集的有关内存分配的数据。

某些打印机驱动程序在分配图形设备接口时分配 Drsd 标记, (GDI) 对象和关联的内存。 如果打印机驱动程序有对象泄漏,则使用 Drsd 标记分配的内存也会泄漏。

注意 在运行此示例中的步骤之前,请确保所使用的打印机在完成之前不会中断。 否则,结果可能无效。

在命令行中,键入以下内容:

poolmon /iDrsd

此命令指示 PoolMon 显示具有 Drsd 标记的分配信息。 (池标记区分大小写,因此请务必按如下所示键入命令。)

记录 Diff 和 Bytes 列中的值。 在以下示例显示中,Diff 的值为 21,字节数为 17472。

Memory:  130480K Avail:   91856K  PageFlts:  1220   InRam Krnl: 2484K P: 7988K
Commit:  30104K Limit: 248432K Peak:  34028K            Pool N: 2224K P: 8004K
Tag  Type        Allocs           Frees           Diff  Bytes           Per Alloc

Drsd Paged       560 ( 177)       539 ( 171)       21   17472 (  4992)    832 

将作业发送到打印机,等待 Windows 恢复正常,然后记录 Diff 和 Bytes 列的值。

Memory:  130480K Avail:   91808K  PageFlts:  1240   InRam Krnl: 2488K P: 7996K
Commit:  30152K Limit: 248432K Peak:  34052K            Pool N: 2224K P: 8012K
Tag  Type        Allocs           Frees           Diff  Bytes          Per Alloc

Drsd Paged       737 (   0)       710 (   0)       27   22464 (     0)    832  

当打印机驱动程序的内存管理正常工作时,Diff 的值应在打印后返回到其原始值 21。 但是,如前面的输出所示,Diff 的值上升到 27,字节数增加到 22464。 初始输出和后续输出之间的差异意味着在打印过程中泄漏了 6 个 Drsd 块,总共 4992 个字节。

有关详细信息

如果你认为你已识别出泄漏的驱动程序,请转到 Microsoft 支持 网站并在知识库中搜索相关文章,或者如果这是第三方驱动程序,请与供应商联系。

示例 5:监视终端服务器会话

此示例演示从终端服务会话池显示分配的几种方法。 它演示了 使用 /s 命令行参数以及 运行参数的 s、 TSSessionID 和 i 。

以下命令显示来自所有终端服务会话池的分配。 在此示例中,配置为终端服务器的本地计算机承载会话,客户端计算机使用远程桌面功能连接到主机。

poolmon /s

作为响应,PoolMon 显示来自所有会话池的分配。 请注意标头中的“所有会话池信息”标题。

Memory:  523572K Avail:  233036K  PageFlts:   344   InRam Krnl: 1828K P:18380K
Commit: 193632K Limit:1279764K Peak: 987356K            Pool N:14332K P:18644K
All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     88876 (   1)     88876 (   1)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9829 (   0)      9801 (   0)       28   19712 (     0)    704
 Gcac Paged      3761 (   0)      3706 (   0)       55  288968 (     0)   5253
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6277 (   0)      6271 (   0)        6    1872 (     0)    312
 ...

若要查看来自特定会话池的分配,请在 /s 参数后面键入会话 ID,如以下命令所示。 此命令显示终端服务会话 0 的会话池分配。

poolmon /s0

作为响应,PoolMon 显示来自终端服务会话 0 的会话池的分配。 请注意标头中的“会话 0 池信息”标题。

Memory:  523572K Avail:  233024K  PageFlts:   525   InRam Krnl: 1828K P:18384K
 Commit: 193760K Limit:1279764K Peak: 987356K            Pool N:14340K P:18644K
 Session 0 pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

 Bmfd Paged       361 (   0)       336 (   0)       25   57832 (     0)   2313
 DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60
 Dddp Paged         8 (   0)         6 (   0)        2     272 (     0)    136
 Dh 1 Paged        24 (   0)        24 (   0)        0       0 (     0)      0
 Dh 2 Paged       344 (   0)       344 (   0)        0       0 (     0)      0
 Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 GDev Paged       108 (   0)       102 (   0)        6   20272 (     0)   3378
 GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80
 GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272
 GTmp Paged     89079 (  99)     89079 (  99)        0       0 (     0)      0
 GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0
 Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0
 Gbaf Paged      9830 (   0)      9802 (   0)       28   19712 (     0)    704
 Gcac Paged      3762 (   0)      3707 (   0)       55  283632 (     0)   5156
 Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488
 Gdbr Paged      6280 (   0)      6274 (   0)        6    1872 (     0)    312
 ...

若要帮助确定哪些驱动程序和组件正在从会话池分配内存,请添加 /g 参数,如以下命令所示。 /g 参数添加一个Mapped_Driver列,其中列出了分配每个标记的 Windows 组件和驱动程序。

poolmon /s0 /g

Memory:  523572K Avail:  235876K  PageFlts:    43   InRam Krnl: 1900K P:18860K
Commit: 185040K Limit:1279764K Peak: 987356K            Pool N:14684K P:19124K
Session 0 pool information
Tag  Type     Allocs            Frees            Diff   Bytes      Per Alloc  Mapped_Driver

Bmfd Paged       421 (   0)       396 (   0)       25   57832 (     0)   2313 [Font related stuff]
DDfb Paged        34 (   0)        22 (   0)       12     720 (     0)     60 Unknown Driver
Dddp Paged        11 (   0)         6 (   0)        5     392 (     0)     78 Unknown Driver
Dh 1 Paged        37 (   0)        35 (   0)        2     224 (     0)    112 Unknown Driver
Dh 2 Paged       367 (   0)       364 (   0)        3     912 (     0)    304 Unknown Driver
Dvgr Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [vga for risc video driver]
GDev Paged       119 (   0)       113 (   0)        6   20272 (     0)   3378 [Gdi pdev]
GFil Paged        29 (   0)        27 (   0)        2     160 (     0)     80 [Gdi engine descriptor list]
GPal Paged        11 (   0)         8 (   0)        3     816 (     0)    272 [Gdi Objects]
GTmp Paged     98626 (   1)     98626 (   1)        0       0 (     0)      0 [Gdi Objects]
GUma Paged         2 (   0)         2 (   0)        0       0 (     0)      0 [Gdi Objects]
Galp Paged      3250 (   0)      3250 (   0)        0       0 (     0)      0 [Gdi Objects]
Gbaf Paged     10331 (   0)     10305 (   0)       26   18304 (     0)    704 [Gdi Objects]
Gcac Paged      4722 (   0)      4666 (   0)       56  305400 (     0)   5453 [Gdi glyph cache]
Gcsl Paged         1 (   0)         0 (   0)        1     488 (     0)    488 [Gdi string resource script names]
Gdbr Paged      6972 (   0)      6965 (   0)        7    2184 (     0)    312 [Gdi driver brush realization]

还可以在 PoolMon 运行时配置终端服务会话池显示。 下表按键入顺序显示一系列正在运行的命令,以及生成的 PoolMon 显示。

该系列以启动 PoolMon 的命令开头。 当 PoolMon 运行时,所有其他参数都会被键入。

poolmon
结果 说明

s

显示所有会话池。

 

s

显示系统池。

s 参数在系统池和终端服务会话池之间切换显示。

0

显示会话 0 池。

可以在显示系统池时键入会话 ID。

7

显示会话 7 池。

 

a

显示会话 7 的池分配,按分配数排序。

所有标准运行参数都对会话池显示有效。

0

显示会话 0 的分配,按分配数排序。

会话和排序选项将保留,直到更改。

s

显示系统池。

 

s

显示会话 0 的分配,按分配数排序。

保留会话选项。

10ENTER

显示会话 1 分配,然后显示会话 0 分配。

如果没有 i,则只能输入会话 ID 0 到 9。

i

提示输入终端服务器会话 ID。

 

10

显示会话 10 分配。

 

i

提示输入终端服务器会话 ID。

若要显示所有会话池,请按 i ,然后按 Enter。

ENTER

显示所有会话池。

 

只有配置为终端服务器的系统才能从会话池中分配内存。 如果使用 PoolMon 在不是终端服务器的计算机上显示会话池,或者键入 Windows 上不存在的会话 ID,PoolMon 不会显示任何分配。 相反,它只显示包含常规内存数据的标题。

以下命令显示来自所有终端服务会话池的分配:

poolmon /s

下图显示了将 /s 命令提交到运行 Windows XP 但无法配置为终端服务器的计算机时生成的 PoolMon 显示:

 Memory:  260620K Avail:   44956K  PageFlts:   308   InRam Krnl: 2744K P:20444K
 Commit: 185452K Limit: 640872K Peak: 192472K            Pool N: 8112K P:20648K
 All sessions pool information
 Tag  Type     Allocs            Frees            Diff   Bytes       Per Alloc

poolmon.exe

poolmon.exe 是一个内存池监控工具,用于显示 Windows 系统中不同内存池(比如非分页池、分页池)中的对象和其占用的内存,可以帮助开发者进行内存泄漏的排查。

内存信息

  • 总内存 (Memory): 33,375,908 KB
  • 可用内存 (Avail): 25,812,348 KB
  • 页面错误数 (PageFlts): 0
  • 内存中内核大小 (InRam Krnl): 72,140 KB
  • 私有工作集 (P): 671,756 KB
  • 提交内存 (Commit): 8,161,072 KB
  • 提交限制 (Limit): 38,618,788 KB
  • 提交峰值 (Peak): 9,024,860 KB
  • 非分页池 (Pool N): 416,752 KB
  • 分页池 (P): 699,404 KB

系统池信息

标签 (Tag) 类型 (Type) 分配次数 (Allocs) 释放次数 (Frees) 差异 (Diff) 字节数 (Bytes) 每次分配的平均字节数 (Per Alloc)

此输出显示了系统的内存使用情况,包括总的物理内存、当前可用的内存量、页面错误的数量(这里为0,表示没有发生页面错误)、内核占用的内存量、进程的私有工作集大小、已提交的虚拟内存量及其限制和峰值,以及系统池(非分页池和分页池)的使用情况。

此外,表格部分提供了更详细的系统池信息,列出了每个标签(通常是内部使用的标识符)对应的内存分配类型、分配和释放的次数、差异(即当前活跃的分配数量)、占用的总字节数,以及每次分配的平均字节数。这些信息对于诊断内存泄漏、优化内存使用和了解系统性能非常有用。

posted @ 2024-12-11 17:01  suv789  阅读(26)  评论(0编辑  收藏  举报