2012-04-23 34 views
3

我們的MVC3 Web應用程序和我們的WCF數據層服務之間存在內存泄漏問題。WCF/Castle發生內存泄露

我相信問題來自WCF方面,雖然不能追蹤它。我搜索了網絡和這些論壇,但一直未能找到原因。任何幫助將非常感激!

所以 - 最初的症狀是w3wp進程與後端不斷增長有關的大小。每次通過調用服務的Web應用程序進行簡單調用時,我們都可以看到它增長了一個可變量(數量級爲100kb)。對應用

運行Jetbrains的內存配置文件,我們可以看到,

System.ServiceModel.Channels.TransmissionStrategy.SlidingWindow 

是遙遙領先的罪魁禍首。在應用程序啓動時,有4個對象用少量內存實例化(佔總數的6.4%),在輕度使用後,它升至> 200個對象,約佔總數的50%。繼續使用將其推向100%。我從來沒有聽說過這個,但是一些使用Google表明它在WCF層數據傳輸中使用(除其他外)。

我目前的思路是正在創建進程,但從未正確釋放。從城堡創建我們的服務,並從網絡端註冊爲:

public static IWindsorContainer RegisterWcfService<TS, TI>(this IWindsorContainer container) 
where TI : TS 
where TS : class 
{ 
container.Register(Component.For<TS>().ImplementedBy<TI>().Named(typeof(TI).Name) 
    .Interceptors<LoggingInterceptor>() 
    .Interceptors<ExceptionHandlerInterceptor>() 
    .LifeStyle.Transient 
    .AsWcfService(
     GetServiceModel<TS, TI>() 
     )); 

return container; 
} 

正如其他線程建議,我們正在使用

container.Kernel.ReleasePolicy = new NoTrackingReleasePolicy(); 

,以確保部件應正確釋放。我們沒有明確處理我們的任何服務引用,儘管我相信上面的內容應該足夠了。有沒有人有任何建議或建議我們的泄漏可能來自哪裏?

+0

你確定內存不能被回收?整個機器內存是否承受壓力?難道是因爲有足夠的記憶,它只是不回收它? – 2012-04-23 09:12:39

+0

完全確定,它沒有被回收 – Chris 2012-04-23 13:47:29

回答

4

不幸的是,手動管理WCF代理的處理是確保垃圾收集和釋放網絡資源的內存釋放的最可靠的方法。這個brief blog post解釋了一些導致WCF代理泄漏內存網絡資源的問題。由於您已將容器配置爲創建臨時代理實例,因此應該將服務調用邏輯包裝成與文章中所示類似的模式。

如果這不能解決您的問題,您需要通過使用WinDbg的內存轉儲來查找實際的GC根目錄是否保存了SlidingWindow實例的參考鏈。 PS:不要試圖使用更長壽的範圍(請求或消滅思想,單身)來嘗試解決這個問題。解決方案是正確處置代理實例。我發現這是困難的方式... ;-)

+0

謝謝,我擔心這可能是這種情況。 – Chris 2012-04-23 13:48:43