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


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

一、 内存构成

在这里插入图片描述
  拿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.com/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、正常的操作系统分页缓存池不会很大,虚拟内存也不会一直涨。任务管理器查看内存状态如下就正常了是😊。(几百兆)
在这里插入图片描述

  • 51
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
Linux内存泄漏是指在程序执行过程中,分配的内存未能被正确释放,导致内存占用逐渐增加的问题。 造成Linux内存泄漏的原因主要有以下几点: 1. 错误的内存分配和释放:程序使用malloc或new等函数分配了一块内存,但忘记了使用free或delete等函数释放内存。 2. 循环引用:在使用动态内存管理的情况下,对象之间可能存在循环引用,当对象间的引用关系无法被断开时,这些对象将无法被垃圾回收,导致内存泄漏。 3. 文件描述符未关闭:文件打开后未进行适当的关闭,导致系统资源无法释放。 4. 缓存未释放:程序中使用了缓存,但未在适当的时候进行清理,导致缓存占用大量内存。 解决Linux内存泄漏的办法包括以下几点: 1. 定期检查和审查代码:开发人员应该进行定期的代码审查,确保内存的正确释放。对于使用动态内存分配的情况,应该在分配内存后及时释放,避免出现忘记释放内存的情况。 2. 使用内存管理工具:Linux提供了一些内存分析工具,例如Valgrind等,可以帮助检测和诊断内存泄漏问题。开发人员可以使用这些工具来定位内存泄漏的具体位置。 3. 注意文件描述符的关闭:对于打开的文件描述符,确保在使用完毕后进行适当的关闭操作,避免资源泄漏。 4. 缓存管理:程序中使用缓存时,需要在合适的时机进行清理,避免缓存占用过多内存。 总之,对于Linux内存泄漏问题,开发人员应该注重代码的规范性和内存管理的正确性,加强代码审查和使用合适的工具来帮助定位和解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值