Eclipse RCPアプリケーション内で依存性注入(DI)を使用しています。私は以下のようなコードを実行するクラスがたくさん持っている:私はjvisualvmを使用してアプリケーションを監視する場合メモリリーク/ ContextInjectionFactory/IEclipseContext
public class SomeClass {
@Inject
private IEclipseContext context;
private SomeObject void someMethod(){
SomeObject someObject =
ContextInjectionFactory.make(SomeObject.class, context);
// Do stuff with someObject
}
}
を、私はこれのためにメモリリークがあると気づきます。 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を使用すると全体的に優れたアプローチがありますか?
私のコードには多くのクラスがあり、その中には@ Sington/@Creatableというアノテーションが付けられています。これらが廃棄された親コンテキストによって影響を受けるかどうかはわかりません。
ありがとうございます!
私は漏れがあるという報告を見たことがなく、私のコードではこれを見ていません。 –
それは間違いなく間違いです。私のコードの唯一の違いは、上記のものです。私は多くのオブジェクトを作成します。オブジェクトの多くは、もはや必要なくなったときに破壊されます。数日のうちに、主なコンテキストには何百万ものオブジェクト参照があり、メモリエラーが発生するまでそれが成長しています。回避策を実行するとすべてがうまくいく。回避策を使用することによる悪影響をご存知ですか? – ekjcfn3902039
子コンテキストを使って何かを実行すると、IEclipeContextが注入された場合、後でそれにアクセスしようとすると、破棄されたコンテキストにアクセスすることになります。これにより、エラーをデバッグするのが困難になります。これらの参照をすべて格納しているEclipseContextクラスのフィールドを知っていますか? –