Я использую инъекцию зависимостей (DI) внутри приложения RCP Eclipse. У меня есть много классов, которые выполняют код, аналогичный ниже:Утечка памяти/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. Я не уверен, что это будет осуществляться с помощью расположенного родительского контекста.
Спасибо!
Я не видел никаких сообщений о наличии утечки, и я не видел этого в своем коде. –
Да, это определенно странно. Единственное отличие в моем коде - это то, что показано выше. Я создаю много объектов, большинство из которых уничтожаются, когда они больше не нужны. В течение нескольких дней я замечаю, что в главном контексте есть миллионы ссылок на объекты, и он растет, пока я не получу ошибку памяти. Если я сделаю обходной путь, все будет хорошо. Знаете ли вы о каком-либо негативном воздействии с помощью обходного пути? – ekjcfn3902039
Если что-либо, что вы делаете с дочерним контекстом, вставляет IEclipeContext, он в конечном итоге обратится к удаленному контексту, если он попытается получить к нему доступ позже. Это затрудняет отладку ошибок. Вы знаете, какое поле в классе EclipseContext хранит все эти ссылки? –