我在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注释的。我不确定这些是否会受到父母背景的影响。
谢谢!
答案 0 :(得分:2)
当你使用注入来设置你的类中的字段时:
public class Test
{
@Inject
private StatusReporter rep;
@Inject
private IEventBroker broker;
public Test()
{
}
}
Eclipse必须跟踪已注入的每个字段,以便在Eclipse Context中的值发生更改时重新注入该字段。这涉及为每个注入的字段创建TrackableComputationExt
和ContextInjectionListener
个对象。
如果您在构造函数中注入值,请执行以下操作:
public class Test
{
private StatusReporter rep;
private IEventBroker broker;
@Inject
public Test(StatusReporter rep, IEventBroker broker)
{
this.rep = rep;
this.broker = broker;
}
}
Eclipse不需要跟踪构造函数注入,因此不会创建这些对象(但如果更改了上下文值,您也不会获得任何更新。)
测试时,似乎仍然创建了一个内部使用跟踪对象。