J'utilise l'injection de dépendance (DI) dans une application RCP Eclipse. J'ai beaucoup de classes qui effectuent un code similaire à ci-dessous:Memory Leak/ContextInjectionFactory/IEclipseContext
public class SomeClass {
@Inject
private IEclipseContext context;
private SomeObject void someMethod(){
SomeObject someObject =
ContextInjectionFactory.make(SomeObject.class, context);
// Do stuff with someObject
}
}
Lorsque je contrôle l'application à l'aide jvisualvm, je remarque qu'il ya une fuite de mémoire à cause de cela. L'objet EclipseContext ne cesse de croître jusqu'à ce qu'il finisse par manquer de mémoire.
Si je fais ce qui suit, la fuite de mémoire en va:
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
}
}
Je ne l'ai pas vu tous les documents qui prend en charge de faire ma solution de contournement. Existe-t-il des effets secondaires négatifs pour disposer de childContext après la création de la classe? Y a-t-il une meilleure approche globale en utilisant CIF que je n'ai pas rencontré?
Pour ce que ça vaut, mon code a beaucoup de classes, dont certaines sont annotées avec @Singleton/@Creatable. Je ne suis pas sûr si ceux-ci seraient effectués par un contexte de parent disposé.
Merci!
Je n'ai vu aucun rapport de fuite et je n'ai pas vu cela dans mon code. –
Ouais c'est vraiment étrange. La seule différence dans mon code est ce qui est montré ci-dessus. Je crée beaucoup d'objets dont la plupart sont détruits quand ils ne sont plus nécessaires. Au cours de quelques jours, je remarque qu'il y a des millions de références d'objets dans le contexte principal et ça grandit jusqu'à ce que j'obtienne une erreur de mémoire. Si je fais la solution, tout va bien. Connaissez-vous un impact négatif en utilisant la solution de contournement? – ekjcfn3902039
Si quelque chose que vous faites avec le contexte enfant injecte IEclipeContext, il finira par accéder à un contexte éliminé s'il tente d'y accéder plus tard. Cela donne des erreurs de débogage difficiles. Savez-vous quel champ de la classe EclipseContext stocke toutes ces références? –