Windows XP对于每个进程的用户句柄有10000个的限制,每个桌面会话总共有32000个的限制。但是当我运行4或5个SWT进程时,每个进程消耗不超过2000个用户句柄,总是会抛出SWT No More Handles异常。
有人知道为什么吗?
如果我理解正确,你可能会遇到以下异常:
org.eclipse.swt.SWTError: No more handles
您可能正在创建资源(例如Font
、Image
或GC
对象),但未能正确处理它们。建议您花一些时间阅读 SWT 指南中的“管理操作系统资源”章节,以确定是否出现了这种情况。你的程序很可能存在某种资源泄漏。使用以下实用工具 (http://www.eclipse.org/articles/swt-design-2/sleak.htm) 可以轻松找到 SWT 资源泄漏问题。我曾经在一个 RCP 应用程序中使用它来清理一系列问题。
句柄的限制不是10000个。如果内存允许,应用程序可以使用远远多于10000个句柄。限制在于GDI和用户资源(图形元素)。
SWT应用程序使用了什么资源(您可以通过任务管理器查看)?这将有助于了解哪些资源泄漏了。
我在Eclipse 3.6 SR1中也遇到过这个错误,结果发现是因为有数百个编辑器标签未关闭。关闭这些标签后,错误得以解决。
就记录而言,如果这是我的问题,我会接受@Paul的答案。然而,有一个狡猾的问题,我想在这里添加,以帮助其他人解决这个问题...
检查您对字体的使用。
在我的情况下,我的句柄并不是很高,而是新建了字体实例并将它们交给StyledText样式。我必须声明我想要使用的字体一次,类级别。这为我解决了问题。
在我的Windows7 x64系统上,当TeamViewer 8运行时(www.teamviewer.com),我可以重现这个问题。当我停止TeamViewer时,该错误消失。
您可以查看:https://bugs.eclipse.org/bugs/show_bug.cgi?id=402983
希望这有所帮助。
我也遇到了这个问题,但现在我已经解决了。
在我的情况下,我正在通过Citrix XenApp运行Win7 SP1和Spring Tool Suite 3.7.2(Eclipse Mars 4.5.1)。当我在“包资源管理器”和“Java编辑器”之间切换时,就会出现此错误。
我的解决方案:
在Win7中运行services.msc,找到“平板电脑输入服务”,停止它。
希望这可以帮助其他人。