Windows XP 的每个进程限制为 10000 个用户句柄,每个桌面会话总共限制为 32000 个。但是,当我运行 4 或 5 个 SWT 进程,每个进程消耗不超过 2000 个用户句柄时,总是会抛出 SWT No More handles 异常。
有谁知道为什么?
如果我理解正确,您可能会遇到以下异常:
org.eclipse.swt.SWTError: No more handles
您可能正在创建未正确处理的资源(例如Font
或Image
对象GC
)。您可能需要花点时间阅读有关管理操作系统资源的 SWT 指南。
要确定是否确实如此,我可以推荐这篇有用的文章:诊断 SWT/RCP Windows 应用程序中的句柄泄漏,它解释了资源是什么,并建议使用Process Explorer或DPus来定位泄漏。
一位同事还强烈推荐Sleak,这是一个专注于 SWT 的应用程序,它实际上可以告诉您哪些资源剩余在剩余内存中。
为了从技术上理解 SWT 正在制作什么句柄,这篇 Sybase 文章描述了三种句柄:用户对象、GDI 对象或内核对象句柄,每种句柄都有自己的最大值。
您的程序中很可能存在某种资源泄漏。使用以下实用程序 ( http://www.eclipse.org/articles/swt-design-2/sleak.htm ) 作为查找 swt 资源泄漏的简单方法。我用它来清理我正在开发的 rcp 应用程序中的一大堆问题
限制不是 10000 个句柄。应用程序可以使用超过 10000 个句柄(如果 RAM 允许)。限制在 GDI 和用户资源(图形元素)上。
SWT 应用程序使用什么样的资源(您可以通过 taskmgr 看到这一点)?这将有助于了解什么是泄漏。
作为记录,如果这是我的问题,我会接受@Paul 的回答。但是,我想在这里添加一个鬼鬼祟祟的问题,如果他们遇到这个问题,可能会帮助其他人......
检查您对字体的使用。
就我而言,我的句柄并没有那么高,而是我正在新建字体实例并将它们交给 StyledText 样式。我不得不声明我想使用一次的字体,类级别。这为我修好了。
我在 eclipse 3.6 SR1 中也看到过这个错误,结果证明它是由数百个编辑器选项卡保持打开状态引起的。关闭选项卡修复了错误。
尝试以下步骤:
在我的 Windows7 x64 系统上,我可以在 TeamViewer 8 运行时重现它(www.teamviewer.com)。当我停止 TeamViewer 时,错误消失了。
您可以查看:https ://bugs.eclipse.org/bugs/show_bug.cgi?id=402983
希望有帮助。
我也遇到了这个问题,但现在我已经解决了。
就我而言,我通过 Citrix XenApp 运行带有 SP1 和 Spring Tool Suite 3.7.2 (Eclipse Mars 4.5.1) 的 Win7。当我在Package Explorer和Java Editor之间切换时会发生此错误。
我的解决方法:
在Win7下运行services.msc,找到“Tablet PC Input Service”,停止。
希望这可以帮助其他人。