什么是Windows“USER对象”

时间:2009-05-15 12:47:59

标签: windows winapi mfc

我正在尝试在我们的MFC代码中查找看起来像资源限制问题的问题。内存和CPU看起来很好。根据任务管理器上的进程选项卡,我们的GDI对象与其他应用程序一致,但我们的USER对象似乎比其他应用程序大10倍。

什么是“USER对象”,有什么限制?

4 个答案:

答案 0 :(得分:12)

阅读所有相关内容here

对象类别

系统提供三类对象:用户,图形设备接口(GDI)和内核。系统使用用户对象来支持窗口管理,GDI对象支持图形,内核对象支持内存管理,进程执行和进程间通信(IPC)。有关创建和使用特定对象的信息,请参阅相关概述。

用户对象

用户界面对象每个对象仅支持一个句柄。进程无法继承或复制用户对象的句柄。一个会话中的进程无法引用另一个会话中的用户句柄。

每个会话的理论上限为65,536个用户句柄。但是,每个会话可以打开的最大用户句柄数通常较低,因为它受可用内存的影响。用户句柄也有默认的每进程限制。要更改此限制,请设置以下注册表值:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota

此值可以设置为介于200和18,000之间的数字。

答案 1 :(得分:11)

以下是“经典”MSDN文章:Give Me a Handle, and I'll Show You an Object

上次我追踪Windows对象泄漏(我怀疑你有)Process Explorer很方便(handley?)。下部窗格可以显示一些已分配的系统对象,另外它可以执行简单的USER,GDI等对象计数。

desktop heap,它是一个内存池,其中句柄所代表的真实“东西”(至少有一些句柄,至少不是内核句柄)。有时并没有分配多少句柄,而是在该句柄下每个对象使用了多少内存。您可以调试堆this way。它是pain安装。

答案 2 :(得分:2)

Mark Russinovich是该主题的专家。他写了《 Windows Internals》一书。幸运的是,不仅有本书,而且还有article dating 2019-06-27

首先,他描述USER对象:

USER对象之所以得名,是因为它们表示用户界面元素,例如桌面,窗口,菜单,光标,图标和加速器表(菜单键盘快捷键)。

然后继续描述限制:

窗口管理器施加的基本限制是,任何进程都不能创建超过10,000个USER对象。

USER对象数量的一个基本限制来自以下事实:它们的标识符在Windows的第一个版本中为16位,即16位。当在更高版本中添加了32位支持时,USER标识符必须保持为16位值限制,以便16位进程可以与Windows和由32位进程创建的其他USER对象进行交互。因此,在会话上可以创建的USER对象总数限制为65,535(2 ^ 16)

他还解释了数字mentioned by @Tobi

由于历史原因,窗口必须具有偶数编号的标识符,因此每个会话最多可以有32,768个窗口

答案 3 :(得分:1)

我不知道它们是什么,但我知道它们包含窗口句柄。

对于窗口句柄,系统范围最大值约为32000,每个进程最大值为10000.(这可能只是USER对象限制,而不仅仅是窗口句柄。)

如果某种方式泄漏窗口句柄,或者使用大量窗口,窗口句柄的数量可能会非常高。 (请注意,即使像文本标签这样的简单控件也会占用单个窗口句柄。)