java - "no more handles"的原因

标签 java resources swt handle

对于我们基于 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/

相关文章:

c++ - C++ 新手,需要有用的示例

java - JAXB 比 XSLT 有什么好处?

java - Android 选项卡,如何显示所选选项卡的图像

resources - Smalltalk:单个对象可以通过进入无限循环来阻塞整个系统吗?

带有图像资源的 iOS 静态库

java - Java Swing For mac 中的 DJ Native Swing 浏览器

java - Uiautomatorviewer SWT 异常

java - 如何将一个组合添加到另一个组合?

java - 通过 RMI 实现观察者模式

java - Flux 是如何垃圾收集的?