在 Windows 机制里面,将在物理内存、换页池、非换页池以及提交用量很多或很少时,向用户模式进程和内核模式驱动程序提供通知。本文将重点放在用户模式的进程上
本文属于读 《深入解析 Windows 操作系统》 读书笔记
应用程序可以调用 CreateMemoryResourceNotification function 函数指定自己期望接收到内存多或内存少的通知
如在 dotnet 的 CLR 层的 finalizerthread 部分,就使用了以下代码进行获取通知
MHandles[kLowMemoryNotification] =
CreateMemoryResourceNotification(LowMemoryResourceNotification);
以上的参数的 LowMemoryResourceNotification 表示的是可用物理内存不足。对应的还有 HighMemoryResourceNotification 表示可用物理内存很高
配合 QueryMemoryResourceNotification function 可以进行查询当前的内存状态
使用例子代码请参阅 https://stackoverflow.com/a/54529790 提供的例子
另一个方面则是通过以下内存管理器的通知事件获取通知
- HighCommitCondition: 如果提交用量接近最大提交限制,即内存用量非常大,物理内存或页面文件中可用空间极为有限,且系统无法增加页面文件的大小,将设置此事件。换句话就是内存用多了,能释放的话赶紧释放
-
LowCommitCondition: 当提交用量相对于当前提交限制较低,即内存用量低,且物理内存或页面文件存在大量可用空间时,将设置该事件。换句话说就是现在豪气,随便用
- HighMemoryCondition: 当空闲物理内存数量超过预设值时将设置该事件
- LowMemoryCondition: 当空闲物理内存数量低于预设值时将设置该事件
如果要查看内存资源通知事件,可以运行微软极品工具箱的 WinObj 工具,查看 KernelObjects 文件夹里面的大内存和小内存事件,如下图所示
双击即可看到对应的对象产生了多少句柄和引用
如果想要了解系统中有哪些进程请求了内存资源通知,可以使用 Process Explorer 的 Find 菜单进行搜索句柄表,如下图
更详细内容请大家自行阅读书籍
参考文档:
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/win32-%E4%BD%8E%E5%86%85%E5%AD%98%E9%80%9A%E7%9F%A5%E4%BA%8B%E4%BB%B6.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://blog.lindexi.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
以上广告全是友情推广,无盈利