对于我们基于 SWT 的应用程序,我们有一些不同的 SWT 崩溃报告,其中 SWT 崩溃并出现“没有更多句柄”错误。这种情况只发生在极少数人身上,有时甚至发生在启动应用程序的早期阶段。早期应用程序状态的典型堆栈跟踪如下所示:
Caused by: org.eclipse.swt.SWTError: No more handles
at org.eclipse.swt.SWT.error(SWT.java:4467)
at org.eclipse.swt.SWT.error(SWT.java:4356)
at org.eclipse.swt.SWT.error(SWT.java:4327)
at org.eclipse.swt.widgets.Widget.error(Widget.java:476)
at org.eclipse.swt.widgets.TaskBar.createHandle(TaskBar.java:103)
at org.eclipse.swt.widgets.TaskBar.<init>(TaskBar.java:96)
at org.eclipse.swt.widgets.Display.getSystemTaskBar(Display.java:2567)
...
我们已经测试了我们的应用程序,在正常情况下它不会泄漏任何资源(字体、颜色、图像、GC 等)、Windows 任务管理器中的值(句柄、USER 对象、GDI 对象、. ..) 只排在前三分之一,但通常不是最前面的。
什么原因会导致这样的问题——会不会是机器上运行了很多应用程序,其他可能被调试的应用程序泄漏了大量资源,还有什么?什么信息,例如“tasklist.exe”的输出 我需要向用户请求以获得可能原因的线索吗?
最佳答案
我刚收到同样的崩溃报告。为了更深入地研究,可以使用以下代码:
import org.eclipse.swt.internal.win32.OS;
import org.eclipse.swt.widgets.Display;
public class InvestigateSwtProblem {
static final byte[] CLSID_TaskbarList = new byte[16];
static final byte[] IID_ITaskbarList3 = new byte[16];
static {
OS.IIDFromString("{56FDF344-FD6D-11d0-958A-006097C9A090}\0".toCharArray(), CLSID_TaskbarList); //$NON-NLS-1$
OS.IIDFromString("{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}\0".toCharArray(), IID_ITaskbarList3); //$NON-NLS-1$
}
public static void main(String[] args) {
Display display = new Display();
int /*long*/[] ppv = new int /*long*/ [1];
int hr = OS.CoCreateInstance(CLSID_TaskbarList, 0, OS.CLSCTX_INPROC_SERVER, IID_ITaskbarList3, ppv);
System.out.println("Result of CoCreateInstance = " + hr);
}
}
在我的例子中,错误是 -2147024882,我在 winerror.h 中发现它是:
//
// MessageId: E_OUTOFMEMORY
//
// MessageText:
//
// Ran out of memory
//
#define E_OUTOFMEMORY _HRESULT_TYPEDEF_(0x8007000EL)
我仍然不知道原因或解决方案,但至少你有话要告诉系统管理员。
附言。这如果用于 32 位 SWT。我没有在 64 位 SWT 上测试过,但我想您应该将代码中出现 int/*long*/ 的 int 替换为 long。
关于java - "no more handles"的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27409887/