访问当前进程句柄

Accessing the current processes handles

在我们的 RCP 4 应用程序中,由于没有更多可用句柄,我们抛出了 SWT 异常。这可能是由资源泄漏或其他第 3 方应用程序 运行 引起的。我们无法在开发中重现此问题,因此我们希望记录任何可能有助于我们在未来解决此问题的信息。

我们想了解有关句柄的信息。例如。总句柄及其用途,例如图像、字体和复合材料。

我一直在查找这个,我正在努力寻找有关如何在 Java 中完成此操作的任何信息。我们可以执行命令行来获取信息,但这并不是一个很好的方法。

Handles 我指的是 GDI HandlesUser HandlesWindows。

如何做到这一点?

plugin.xml

<plugin>
   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            application="org.eclipse.e4.ui.workbench.swt.E4Application"
            name="appid">
         <property
               name="modelResourceHandler"
               value="bundleclass://a.model.resource.handler.ModelResourceHandler">
         </property>
      </product>
   </extension>
</plugin>

Eclipse Sleak 可以监控 SWT 所做的分配 - 代码是 here

然而,这需要创建 SWT Display 并使用 DeviceData 对象启用跟踪。标准 E4Application 不会这样做。

因此,要使用它,您需要使用自己的应用程序 class 扩展 E4Application - 类似于:

import org.eclipse.e4.ui.internal.workbench.swt.E4Application;

import org.eclipse.swt.graphics.DeviceData;
import org.eclipse.swt.widgets.Display;

public class MyApplication extends E4Application
{
  /** Enable tracking */
  private static final boolean TRACKING = true;
  /** Enable debug */
  private static final boolean DEBUG = false;

  public MyApplication()
  {
    super();
  }

  @Override
  public Display getApplicationDisplay()
  {
    Display current = Display.getCurrent();
    if (current == null)
     {
       if (TRACKING || DEBUG)
        {
          DeviceData data = new DeviceData();
          data.tracking = TRACKING;
          data.debug = DEBUG;

          current = new Display(data);

          if (data.tracking)
           {
             Sleak sleak = new Sleak();
             sleak.open();
           }
        }
       else
        {
          current = new Display();
        }
     }

    return super.getApplicationDisplay();
  }
}

您需要在 plugin.xml:

中声明此应用程序
   <extension
         id="application"
         name="Application name"
         point="org.eclipse.core.runtime.applications">
      <application
            cardinality="singleton-global"
            thread="main"
            visible="true">
         <run
               class="your.package.MyApplication">
         </run>
      </application>
   </extension>

更改 plugin.xml 中的产品声明以使用此应用程序而不是 org.eclipse.e4.ui.workbench.swt.E4Application。所以像:

   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            name="%product.name"
            application="my.plugin.application">

作为进一步的示例,以下是来自我的一个 e4 RCP 的经过测试的工作 plugin.xml 的一部分:

<plugin>
   <extension
         id="application"
         name="%app.name"
         point="org.eclipse.core.runtime.applications">
      <application
            cardinality="singleton-global"
            thread="main"
            visible="true">
         <run
               class="greg.music.e4.rcp.MusicApplication">
         </run>
      </application>
   </extension>
   <extension
         id="product"
         point="org.eclipse.core.runtime.products">
      <product
            name="%product.name"
            application="greg.music.e4.rcp.application">
            ...... properties
       </product>
   </extension>

这是在 ID 为 greg.music.e4.rcp 的插件中。这定义了一个 ID 为 greg.music.e4.rcp.application 的应用程序和一个 ID 为 greg.music.e4.rcp.product

的产品