我正试图追踪MFC代码中的一个问题,看起来像是资源限制问题。 内存和CPU看起来不错。 根据任务管理器上的进程选项卡,我们的GDI对象看起来与其他应用程序一致,但我们的USER对象似乎比其他应用程序大10倍。
什么是 "用户对象",限制是什么?
这是一篇 "经典 "的MSDN文章。给我一个句柄,我就给你看一个对象
上次我在追查Windows对象的泄漏(我怀疑你也有)。流程浏览器 是方便(handley?下层窗格可以显示一些分配好的系统对象,另外它还可以进行简单的USER、GDI等对象计数。
在 桌面堆句柄代表的真正的 "东西 "所在的内存池(至少是一些句柄,至少不是内核句柄)。有时并不是说你分配了多少个句柄,而是每个句柄有多少内存 对象 下的句柄正在使用。你可以调试堆中的 这样. 它是一个 痛苦 安装。
阅读全部内容 此处:
对象类别
系统提供三类对象:用户、图形设备接口(GDI)和内核。系统使用用户对象来支持窗口管理,使用GDI对象来支持图形,使用内核对象来支持内存管理、进程执行和进程间通信(IPC)。有关创建和使用特定对象的信息,请参考相关概述。
和 此处:
用户对象
用户界面对象每个对象只支持一个句柄。进程不能继承或重复用户对象的句柄。一个会话中的进程不能引用另一个会话中的用户句柄。
每个会话理论上有65,536个用户句柄的限制。然而,每个会话可以打开的用户句柄的最大数量通常更低,因为它受到可用内存的影响。还有一个默认的每个进程的用户句柄数限制。要更改此限制,可设置以下注册表值。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERProcessHandleQuota
这个值可以设置为200到18,000之间的数字。
我不知道。什么 他们是,但我知道他们 包括 窗口句柄。
对于窗口句柄,系统范围内的最大值约为32000,每个进程的最大值为10000。(这可能只是USER对象的限制,而不仅仅是窗口句柄的限制。)
如果你以某种方式泄漏了窗口句柄,或者你使用了大量的窗口,那么窗口句柄的数量可能会很高。(注意,即使是像文本标签这样的简单控件也会消耗一个窗口句柄)。
Mark Russinovich是这方面的专家。他写过《Windows内部》一书。幸运的是,不仅有这本书,还有一本《Windows内部》。文章交友 2019-06-27.
首先他介绍了USER对象。
USER对象的名字来源于它们代表用户界面元素,如桌面、窗口、菜单、光标、图标和加速器表(菜单键盘快捷键)。
然后继续描述这些限制。
窗口管理器施加的一个基本限制是 任何进程都不能创建超过10,000个USER对象。
而
USER对象数量的一个基本限制来自于在Windows的第一个版本中,它们的标识符是16位值,而Windows是16位的。当后来的版本中增加了对32位的支持时,USER标识符不得不继续限制为16位值,以便16位进程可以与32位进程创建的windows和其他USER对象进行交互。因此,65,535(2^16)是在一个会话上可以创建的USER对象总数的限制。
他还解释了这个数字 由 @Tobi 提及:
由于历史原因,窗口必须有偶数标识符,因此每届会议最多可以有32 768个窗口;