【问题标题】:Can GDI leaks from one process affect other processes?一个进程的 GDI 泄漏会影响其他进程吗?
【发布时间】:2016-02-22 17:04:48
【问题描述】:

我们遇到 GDI 资源泄漏,有时会导致“Win32Exception 没有足够的存储空间来处理此命令”(related question)。

我们的应用程序由 Word Addin 和 C# 应用程序组成。 Word 插件中的泄漏是否可以从 C# 应用程序中删除资源?在一些无关的插件问题后,我们已经看到应用程序崩溃。

换句话说,GDI 资源是按进程独占分配还是以某种方式共享?

【问题讨论】:

  • 是的,GDI 对象是从桌面堆分配的,该桌面堆由在该桌面上运行的所有进程共享。由于 appcompat 的原因,交互式桌面上的大小限制为 64K 对象。但是你不能只用一个泄漏的坏进程来耗尽它,它需要几个。如此怀疑,你找到了真正的原因。否则在任务管理器中很容易看到,使用视图 > 选择列添加“GDI 对象”列。

标签: c# .net gdi+ gdi resource-leak


【解决方案1】:

确切的数字可能取决于 Windows 的版本,但通常每个会话的理论限制为 65,536。实际上,这个数字更低(例如 Windows 2000 中的 16,384)。

每个进程也有大约 10,000 个句柄的限制,尽管这可以通过注册表设置 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota 全局更改。尽管此设置不应由应用程序更改,因为它是计算机的全局设置。

MSDN - GDI Objects

Old New Thing - Why is the limit of window handles per process 10,000?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-17
    • 2012-03-11
    • 2012-03-10
    • 2017-02-28
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2010-11-08
    相关资源
    最近更新 更多