我遇到了一个问题,我的程序在使用 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)动态生成的程序集正在占用您的所有内存?
谢谢你。