关于分页缓冲池与非页面缓冲池,可见文章windows 分页缓冲池 非分页缓冲池。简言之,页面缓冲池,是进程调用某些系统功能时,由系统核心或者驱动程序分配的。如果一个程序占用的页面缓冲池内存不断增大,既为内存泄露。借助poolmon工具,可对这类泄漏问题进行诊断。
poolmon诊断
poolmon是微软驱动开发套件的中一个独立的命令行程序,也可单独下载。(下载地址)。
执行poolmon -b
,按Byte降序排列:
当驱动的Allocs明显大于Frees时即存在明显的内存泄漏。上图中未发现明显的泄漏项,但Tag名为FMfn的条目占用的Bytes非常大,值得关注。使用下面的代码可找到Tag所对应的驱动:
Set-Location "C:\Windows\System32\drivers"
Select-String -Path *.sys -Pattern "FMfn" -CaseSensitive | Select-Object FileName -Unique
可见,FMfn对应的驱动文件是fltMgr,它是系统提供的MiniFilter框架的驱动。MiniFilter是微软开发的过滤管理器,这个驱动主要作用就是如果有文件操作可以通知应用程序。使用fltmc命令可查看系统中存在哪些minifilter。
其中比较可疑的是lrtp,它属于联想电脑管家,这个软件早就删掉了,可能是其残留的驱动,“联想内存泄漏”对其有讨论。
C:/windows/system32/drivers/lrtp.sys
无法直接删除,需要先关闭其开机自启动,重启后即可删除。具体方法是在注册表中找到计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lrtp
项,将其中Start
键的值改为4(表示禁止启动)。重启后即可正常删除C:/windows/system32/drivers/lrtp.sys
。删除lrtp.sys后内存泄漏问题有所缓解,没有完全解决,应该还有其他的问题,待后续研究。
参考资料
windows 分页缓冲池 非分页缓冲池
poolmon下载
Finding Memory Leaks with PoolMon
桌面云虚拟机内存泄露排查
联想内存泄漏
Win10 内存泄露/非分页缓冲池占用过多问题分析定位