内存泄漏/ ContextInjectionFactory / IEclipseContext

时间:2016-09-29 14:22:37

标签: java dependency-injection rcp e4

我在Eclipse RCP应用程序中使用依赖注入(DI)。我有很多类执行类似于下面的代码:

public class SomeClass {
    @Inject
    private IEclipseContext context;

    private SomeObject void someMethod(){
        SomeObject someObject =
            ContextInjectionFactory.make(SomeObject.class, context);
        // Do stuff with someObject
    }
 }

当我使用jvisualvm监控应用程序时,我注意到由于这个原因导致内存泄漏。 EclipseContext对象不断增长,直到它最终耗尽内存。

如果我执行以下操作,内存泄漏就会消失:

public class SomeClass {
    @Inject
    private IEclipseContext context;

    private SomeObject void someMethod(){
        IEclipseContext childContext = context.createChild();
        SomeObject someObject =
            ContextInjectionFactory.make(SomeObject.class, childContext);
        childContext.dispose();
        // Do stuff with someObject
    }
 }

我没有看到任何支持我的解决方法的文档。在创建类之后处理childContext是否有任何负面影响?在使用我还没有遇到的CIF时,总体上有更好的方法吗?

为了它的价值,我的代码有很多类,其中一些是用@Singleton / @Creatable注释的。我不确定这些是否会受到父母背景的影响。

谢谢!

1 个答案:

答案 0 :(得分:2)

当你使用注入来设置你的类中的字段时:

public class Test
{
  @Inject
  private StatusReporter rep;
  @Inject
  private IEventBroker broker;


  public Test()
  {
  }
}

Eclipse必须跟踪已注入的每个字段,以便在Eclipse Context中的值发生更改时重新注入该字段。这涉及为每个注入的字段创建TrackableComputationEx‌​t‌​ContextInjectionList‌​ener个对象。

如果您在构造函数中注入值,请执行以下操作:

public class Test
{
  private StatusReporter rep;
  private IEventBroker broker;

  @Inject
  public Test(StatusReporter rep, IEventBroker broker)
  {
    this.rep = rep;
    this.broker = broker;
  }
}

Eclipse不需要跟踪构造函数注入,因此不会创建这些对象(但如果更改了上下文值,您也不会获得任何更新。)

测试时,似乎仍然创建了一个内部使用跟踪对象。