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