Castle Windsor とインターセプターを使用すると、プログラムがメモリ不足になるという問題が発生しました。次のコードを使用して再現可能です。
public interface ITest{}
public class Test : ITest {}
class TestInterceptor:IInterceptor {
public void Intercept(IInvocation invocation) {}
}
class Program {
static void Main(string[] args) {
while(true) {
using(var container = new WindsorContainer()) {
container.Register(Component.For<TestInterceptor>());
container.Register(Component.
For<ITest>().
ImplementedBy<Test>().
Interceptors(
InterceptorReference.ForType<TestInterceptor>()
).Anywhere);
var tst = container.Resolve<ITest>();
}
}
}
}
これは、メモリ使用量がどのように発展するかです。
だから私を失望させたのは、非マネージ コードのメモリ リークがあると思っていたということでしたが、多くのデバッグの後、問題はインターセプター prxoy の生成にあることがわかりました: プロキシ タイプの新しい (動的) アセンブリは解決されるたびにランタイムに導入されます。
さて、私はあなたがこれを解決できると思います
- アプリ全体にグローバル(静的)コンテナを使用していますが、現時点ではこれは私のアプリでは実行できません(これはこれを行うための推奨される方法であり、理由は完全には明らかではありません)
ProxyGenerator
静的を使用して自分でプロキシUsingFactoryMethod
を生成し、インスタンスを生成する方法を使用します(これは現在行っています)
これにより、3つの質問が残ります。
- Castle Windsor を正しく使用していますか (ドキュメントは完全に明確ではありません)、Castle Windsor がプロキシ タイプをキャッシュする方法はありますか?
- Castle Windsor はプロキシ タイプを自動的にキャッシュする必要がありますか (または、現在の動作はバグですか)?
- 動的に生成されたアセンブリがすべてのメモリを消費していることを (たとえば、perfmon を使用して) どのようにデバッグしますか?
ありがとうございました。