0

在 Eclipse RCP 应用程序中,我试图打开许多编辑器。它基本上是一棵树,有很多节点,每个节点都会打开一个编辑器。当我打开 150 到 200 个编辑器的访问权限并尝试为下一个树节点打开一个编辑器时,它不会打开。Eclipse 控制台显示“org.eclipse.swt.SWTError:没有更多句柄”。但是,如果我关闭一些已经打开的编辑器,我可以打开尽可能多的新树节点编辑器。

我监控了 javaw.exe 的内存使用情况;打开每个编辑器时内存会增加,但句柄数在某个 MAX 之后保持不变。发生错误时,javaw.exe 消耗大约 120,000K。错误期间所有应用程序消耗的总内存为 700,000K。如果我尝试打开更多的应用程序,例如 IE,由于系统内存不足,它要么无法打开,要么以较少的 UI 功能打开。尽管有 2GB RAM,但所有这一切!

我还尝试在 eclipse 内存设置中增加 vmargs,但这也没有太大帮助。

a) 我的代码中是否存在内存泄漏?我不认为它在某个 MAX 之后手柄保持不变。据我了解,当编辑器处于打开状态时,其上的 SWT 控件在关闭之前不会被释放。

b) 最大值是多少。可以被应用程序用完的内存?由于我的 RAM 是 2GB,我发现我对所有进程的总体内存应该比我认为大约 680MB 的 700,000K 好得多。

4

4 回答 4

2

a)尝试偷偷摸摸。它可以在您的 SWT 应用程序中找到 GDI 泄漏

b) 您可以尝试更改注册表中的最大 GDI 句柄或用户对象。请参阅此处此处了解更多信息。

您可能还想尝试创建一个虚拟树,以便只创建显示的树节点。

于 2009-05-06T19:41:28.390 回答
1

我无法具体回答您的问题,但在我看来,您正在遇到进程可以随时拥有的打开文件的最大限制(从“句柄”术语判断,该术语通常指打开的文件,很像文件描述符Unix)。这将是操作系统级用户权限/能力的问题。允许打开的文件数与内存大小无关。

于 2009-05-05T04:30:05.467 回答
1

句柄是指文件句柄(打开的文件引用),由操作系统控制。它通常不是用户更改的设置,因为保持大量文件句柄无限期地打开会占用操作系统资源。

这个问题属于如果你不得不问,你可能做错了什么类别。;-)

你最好的选择是打开文件,阅读它然后关闭它。然后在需要写出更改时重新打开文件。如果您担心并发编辑,您可能还需要使用锁定机制。

如果您不想更改太多逻辑,则在将每个文件放入树中时打开+读取+关闭每个文件可能会有所帮助,然后重新打开(以写入)当前位于用户活动视图中的文件,当用户离开时关闭它们。

于 2009-05-05T04:53:47.143 回答
1

Windows 处理几种句柄,例如执行句柄(文件、线程)、GDI 句柄(字体、画笔、设备上下文)、用户句柄(窗口、菜单、大多数本机控件、图像)。对于这些句柄中的大多数,有一个每个进程和一个整体系统限制,这与系统中可用的 RAM 量无关。例如,由于历史原因,每个进程限制为 10000 个用户句柄,每个桌面会话限制为 32000 个用户句柄。有关句柄的深入解释,请参阅http://msdn.microsoft.com/en-us/library/ms810501.aspx 。

所以首先你需要确保你没有泄漏任何句柄,例如使用 Sleak。然后您需要注意,SWT 至少为每个小部件使用一个用户句柄(即使对于普通的 Composite 对象也是如此)。如果您有一个包含大量小部件的大型应用程序,您将达到 10000 个用户对象的限制。我写了一篇简短的博客文章,介绍了我们在产品中为解决此限制所做的工作:http ://www.subshel​​l.com/en/subshel​​l/blog/investigating-user-handles-with-the-swt-detective100.html . 我还将 SWT Spy 破解为一个工具,它允许我调查我们应用程序的小部件树,找到减少小部件数量的地方。此工具的下载链接在博客条目中。

于 2011-12-02T11:29:30.237 回答