2016-09-29 11 views
1

我在Eclipse RCP应用程序内部使用依赖注入(DI)。我有很多的类,以下面执行类似的代码:内存泄漏/ ContextInjectionFactory/IEclipseContext

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注解。我不确定这些是否会受到处置父母的情况影响。

谢谢!

+0

我还没有看到有任何泄漏的报告,我没有看到这在我的代码。 –

+0

是的,这绝对是奇怪的。我的代码中唯一的区别就是上面显示的内容。我创建了很多对象,其中大部分会在不再需要时被破坏。在几天的过程中,我注意到在主要上下文中有数以百万计的对象引用,它会一直增长直到出现内存错误。如果我采取的解决方法一切都很好。您是否知道使用该解决方法会带来哪些负面影响? – ekjcfn3902039

+0

如果您使用子上下文进行任何操作,则会注入IEclipeContext,如果稍后尝试访问它,它将最终访问处置的上下文。这给调试错误带来了困难。你知道EclipseContext类中的哪个字段正在存储所有这些引用吗? –

回答

2

当您使用注射设置字段类是这样的:

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


    public Test() 
    { 
    } 
} 

的Eclipse必须跟踪已注入,以便它可以重新注入,如果现场的每个字段在Eclipse环境的变化值。这涉及为每个注入字段创建对象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有没有必要跟踪构造函数注入使这些对象不创建(但你也不会得到,如果上下文的任何更新值被改变)。

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

+0

奇怪的是,没有人提到我做过的同样的事情,因为我看到很多使用字段注入和构造函数注入的代码。在课程不再使用后,跟踪对象会消失吗?如果我有一个Collection 对象并清除收集,那么跟踪参考是否会消失?我猜(根据我见过的实例的数量),即使我们预计它们不会(虽然我期望它们不会) – ekjcfn3902039

+0

当某些事情“消失”时,Java没有办法跟踪(除非有一些我错过的WeakReference),所以可能不会。它们可能会一直存在,直到背景被处理。但是这个代码非常复杂并且很难阅读(像往常一样)。我认为大多数人只在有限数量的UI对象上使用注入,所以没有打这个。 –