我试图追查我们的MFC代码中的一个问题,看起来像资源限制问题。 内存和CPU看起来不错。 根据任务pipe理器上的进程选项卡,我们的GDI对象与其他应用程序一致,但是我们的USER对象似乎是其他应用程序的10倍。
什么是“用户对象”,有什么限制?
这里是一个“经典”的MSDN文章: 给我一个句柄,我会告诉你一个对象
上次我正在跟踪Windows对象泄漏(我怀疑你有) Process Explorer很方便(handley?)。 下面的窗格可以显示一些分配的系统对象,再加上它可以做简单的USER,GDI等对象计数。
桌面堆 ,这是一个真正的“东西”手柄所代表的内存池(至少有一些句柄,至少不是内核句柄)。 有时并不是多少个句柄分配了多少,而是每个对象在这个句柄下使用了多少内存。 你可以这样调试堆。 这是一个痛苦的安装。
在这里阅读所有信息:
对象类别
系统提供三类对象:用户,图形设备接口(GDI)和内核。 系统使用用户对象来支持窗口管理,支持图形的GDI对象和支持内存管理,进程执行和进程间通信(IPC)的内核对象。 有关创建和使用特定对象的信息,请参阅关联的概述。
用户对象
用户界面对象仅支持每个对象一个句柄。 进程无法继承或重复处理用户对象。 一个会话中的进程不能引用另一个会话中的用户句柄。
每个会话有65,536个用户句柄的理论极限。 但是,每个会话可以打开的最大用户句柄数通常较低,因为它受可用内存的影响。 用户句柄还有一个默认的每进程限制。 要更改此限制,请设置以下注册表值:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota
该值可以设置为200到18,000之间的数字。
我不知道他们是什么 ,但我知道他们包括窗口句柄。
对于窗口句柄,系统最大值为32000,每个进程的最大值为10000.(这可能只是USER对象的限制,而不仅仅是窗口句柄。)
窗口句柄的数量可能会非常高,如果您泄漏窗口句柄的某种方式,或者如果您使用大量的窗口。 (请注意,即使像文本标签这样的简单控件也会占用一个窗口句柄。)