2015-11-05 55 views
1

我在我的WCF应用程序服务器中使用Castle Windsor DI容器。在这种情况下,生命周期是每个请求:创建一个新的服务实例,创建并安装容器,解析一些组件,完成工作并处理所有组件。Castle Windsor DI容器内存泄漏

但是,经过一定数量的请求后,我的应用服务器的内存消耗不断增加。当我注意到DI使用情况时,我能够发现内存问题消失。但是当我安装容器并解析某个组件时,会出现一些“内存泄漏”。 我发现一些文章和文章谈论生命周期。但是他们都被绑定到容器实例。由于我的容器只是在请求期间生存,所以在处理它时一定会被破坏。

我的服务实现了IDisposable,并在Dispose方法中调用container.Dispose。但内存使用量会不断增长。

使用dotMemory分析器我可以看到存在ProxyGenerationOptions和一些其他类的幸存者和新实例。

dotMemory snapshots comparison

我这么想吗?为什么容器在调用Dispose之后没有释放所有已用过的内存?

+0

你看到了同样的问题,如果你使用的是Windows permon?我问内存泄漏的原因与内存使用过多不一样。换句话说,你有信心它是一个“泄漏”? – Spock

+0

我相信这确实是一个漏洞。所有计数器都显示内存消耗增加此外,dotMemory显示生活在内存中的相同Castle。*类的实例的明确数量,并且在每个请求(容器创建 - 安装 - 解析 - 处置)之后该数量增加。我想在容器后面。在那里设置所有的城堡。*对象将被垃圾收集。 –

+0

谁在内存中持有他们?按照类似的保留方式打开组“,或者打开一个实例和”密钥保留路径“视图 –

回答

0

我有一个类似的问题 我解决了它,当我创建的代理类,I服了ModuleScope对象

public static class ProxyFactory 
{ 
    private static ModuleScope _moduleScope = new ModuleScope(false, false); 

    public static TClass CreateProxy<TClass>(TClass instance) 
    { 

       ProxyGenerator proxy = new ProxyGenerator(new DefaultProxyBuilder(_moduleScope)); 


       List<Type> interfaces = new List<Type>();  
       interfaces.AddRange(instance.GetType().GetInterfaces()); 

TClass result = proxy.CreateClassProxyWithTarget(
       instance.GetType(), 
       interfaces.ToArray(), 
       instance, ...... 

    } 

}