一个进程的 GDI 泄漏会影响其他进程吗?

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于一个进程的 GDI 泄漏会影响其他进程吗?的主要内容,如果未能解决你的问题,请参考以下文章

注意内存泄漏的几个地方

注意内存泄漏的几个地方

内存泄漏会导致我的进程被杀死吗?

使用GDI时如何确定是否有内存泄漏

在 Windows CE 6.0 中的进程之间共享 GDI 句柄

检测 winforms 中的 gdi / 用户处理程序泄漏