Windows 7 什么';Windows 7中一个进程的GDI对象的上限是多少?

Windows 7 什么';Windows 7中一个进程的GDI对象的上限是多少?,windows-7,gdi,resource-leak,Windows 7,Gdi,Resource Leak,有一个GDI泄漏的应用程序,它最终会命中10000个分配的GDI对象并崩溃。我试着把目标数增加到20000个,但当目标数达到10000个时,程序还是崩溃了。我们目前正在修补这个漏洞,但出于好奇——有没有办法提高单个进程的GDI限制?或者10k是单个应用程序的硬限制吗?10k是硬限制 GDI对象表示图形设备界面资源,如字体、位图、画笔、笔和设备上下文(绘图表面)。与用户对象一样,窗口管理器将进程限制为最多10000个GDI对象[…] 马克·鲁西诺维奇(MarkRussinovich)有一系列文章深

有一个GDI泄漏的应用程序,它最终会命中10000个分配的GDI对象并崩溃。我试着把目标数增加到20000个,但当目标数达到10000个时,程序还是崩溃了。我们目前正在修补这个漏洞,但出于好奇——有没有办法提高单个进程的GDI限制?或者10k是单个应用程序的硬限制吗?

10k是硬限制

GDI对象表示图形设备界面资源,如字体、位图、画笔、笔和设备上下文(绘图表面)。与用户对象一样,窗口管理器将进程限制为最多10000个GDI对象[…]

马克·鲁西诺维奇(MarkRussinovich)有一系列文章深入探讨了Windows的各种限制。您可能会发现以下两种方法很有用:

陈雷蒙的另一篇好文章:


    • 有一个解决方案可能会奏效。我在这里处理的是一个行为不端的供应商的应用程序,它分配了大量GDI对象,这个解决方案允许它在大部分时间工作

      reg query“HKEY\U LOCAL\U MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Subsystem”/v windows

      查找
      SharedSection=
      ,它应该是由逗号分隔的3个数字。一次将中间的数字增加1024,看看这是否解决了您的问题。您正在使用这个变量控制“桌面堆”的数量,这个变量过去允许我运行一个行为不正常的GDI


      查看更多信息。搜索SharedSection以查找页面的相关部分。

      我可以通过仅更改GDIProcessHandleQuota将我的GDI对象从10000增加到15000,但这需要重新启动才能生效。我不必更改我的SharedSection值,只需要重新启动


      虽然10000看起来是个大数字,但我的应用程序有一个很大的UI,有很多按钮、画笔、图像、图标等。一旦应用程序启动,只有当用户做了一些值得增加的事情时,对象的数量才会增加。没有GDI对象从应用程序泄漏。为了测试我的解决方案,我添加了一个“泄漏”方法,这样我就可以在任务管理器中观察GDI对象数量超过各种限制时发生的情况。

      谢谢您提供的信息。在这里发布之前,我浏览了推动Windows限制的文章,注意到Mark R.没有向您展示如何修改注册表以将默认GDI限制扩展到10k以上,所以我认为这可能是他忽略的。我仍然很困惑,如果这个数字对我的机器没有明显的影响,为什么会高达65535。在Windows中,我可以在所有进程中使用超过10k的对象,而不会出现延迟,直到一个应用程序达到10k时我才会崩溃。
      10k是一个硬限制。
      这似乎不是真的。请您添加有关限制与howto之间关系的详细信息,因为有一个名为GDIProcessHandleQuota的注册表项。改变这个限制似乎并不难。我想你混合了GDI句柄和用户句柄。我知道这个线程很旧,但是对于那些想看到上面Russinovich链接的人来说(至少对我来说,这些链接已经死了),这里有一些活的:宾果!我增加了桌面堆,现在能够远远超过10000个GDI对象。我们的首席开发人员已经提出了一个补丁,但现在我的好奇心已经解决了。谢谢!我的SharedSection设置为102420480768,但python.exe仍然崩溃。我读到过,将桌面堆增加到20480以上是不安全的?你的看法是什么?@Aleksandar:如果我没记错的话,所有这些数字的总数不能超过48MB。这些数字以千字节为单位留出内存。根据您运行的服务数量和内容,还有一些其他限制。阅读Derek Parks答案中的前3个链接以获得良好的背景。还要确保创建的GDI对象不超过10000个。将
      GDIProcessHandleQuota
      增加到
      20000
      对我来说很有效。必须在注册表更改后重新启动系统。更新了位于
      HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota的注册表项