admin管理员组

文章数量:1530863

Windows10内存泄漏,分页池高分析及解决方案

  • 一、 内存构成
  • 二、 定位泄漏软件的两种方法
    • 1、User-Mode 转储堆 (UMDH) 工具
    • 2、Windows poolmon.exe工具
    • 3、终极工具-WPT(Windows Performance Toolkit)定位代码行
  • 三、 Windows10的虚拟内存暴涨的意想不到的原因
    • 1、开发人员
    • 2、消费者
      • A.佛系版本
      • B.折腾版本

作为一名开发定位到导致操作系统内存泄漏的软件是自家公司的产品,岂不是很羞先人!

一、 内存构成


  拿Windows操作系统来分析。如上图所示,Windows中的分页缓存池(paged pool)和非分页缓存池(non-paged pool)通常不是直接供用户层应用程序使用的。这些缓存池是操作系统内核用于管理内存的部分。用户层开发的程序申请的堆内存、栈内存和这没有直接关系,间接发生关系也很难。这个分页与非分页缓冲池的使用是操作系统的内核模块,例如文件系统驱动,硬件驱动等。因为这部分内存的一旦出问题很难排查,所以,内核模块每次申请内存都会调用特殊的API来申请,带上自己的标签tag。

二、 定位泄漏软件的两种方法

1、User-Mode 转储堆 (UMDH) 工具

    如果是任务管理器可以看到哪个进程占内存多,可以用我自己开发的工具进行定位代码行。链接: 参看此文:

2、Windows poolmon.exe工具

3、终极工具-WPT(Windows Performance Toolkit)定位代码行

    参看此文:使用WPT定位导致虚拟内存泄漏的祸首.

三、 Windows10的虚拟内存暴涨的意想不到的原因

1、开发人员

   虚拟内存泄漏的故障原因是PlaySound函数导致,主程序间隔一段时间调一次该函数播放一个很小的WAV文件,win10,8GRAM下,大约20000次就开始暴涨。因为已经定位到最底层的函数了,所以肯定是得从系统这找解决方案了。

2、消费者

A.佛系版本

1、直接使用memReduct 清理下就好了

2、在此处设置定期清理或者当大小超了多少自动清理(管理员权限运行):

下载地址:链接:https://pan.baidu/s/10PD0RCTI0DgzGYxRilhQrg 提取码:kdde

B.折腾版本

1、win+R 打开msconfig

2、点击确定,查看自己的是否是“有选择的启动”

3、如果是有选择启动,恭喜你中奖了,不管是运行啥程序都有可能导致你的虚拟内存不断上涨,一般情况是这样:

4、解决方法往往不是直接把第2条的启动选择改为“正常启动”然后重启那么容易。这是需要鼠标移动到左下角,右键单击以管理员运行powershell,输入命令bcdedit。

5、注意在windows启动加载器这一节,在标识符列有个nx参数,其对应的值是OptIn。nx 用来配置数据执行保护 (DEP),这是一组硬件和软件技术,旨在防止有害代码在受保护的内存位置运行。总共有四种参数可选,微软官方定义如下:

6、输入命令:

bcdedit /set nx Optout

执行完重启结果如下图:

7、正常的操作系统分页缓存池不会很大,虚拟内存也不会一直涨。任务管理器查看内存状态如下就正常了是😊。(几百兆)

本文标签: 分页内存解决方案