2015-11-05 138 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, ...... 

    } 

}