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