2009-05-20 10 views
2

一個新開發的應用程序大量使用Web服務。我們開始定期處理內存異常(隨着使用量的增加)。在審查了內存轉儲後,我注意到有大量相同大小的byte []。看着這些byte []的句柄,我注意到它們被System.Security.Policy.Evidence引用。System.Security.Policy.Evidence,Web服務和吹掉LoH

經過進一步的檢查,我將這些內存分配標識爲實際的程序集(dll),其中有我們的Web服務類(其中2個組件特別是128次內存和115次內存)。我在這裏找到了一些信息 - > blogs.msdn.com/tess/archive/2008/06/25/asp-net-memory-leak-byte-arrays-rooted-in-system-security-policy-evidence。 ASPX

這裏 - > blogs.javista.com/2009/03/18/best-practices-for-crm-memory-usage/

,但我一直沒能找到很多其他參考這個問題。 (.NET框架將web服務程序集加載到內存中以檢查安全策略)。

目前,我看到的唯一解決方案之一是將Web服務的斷言分離爲參考庫的較小程序集。

我很困惑爲什麼.NET框架必須將整個程序集加載到內存中來檢查策略並希望看看是否有其他人遇到過這個問題以及您的解決方案。

感謝, 丹

回答

1

我看到在內存中的同樣的事情在轉儲框架3.5 SP1。

Tess的博客談論這些程序集存儲在ASP.NET緩存中,並且緩存刷新程序集,導致它們被重新加載。建議緩存在系統內存不足時刷新它們,這是ASP.NET緩存中的任何內容的默認行爲。苔絲說,一個熱修復可以解決這個問題。

System.Web.Services的當前版本包含這System.Web.Services.Protocols.ServerProcotol的AddToCache方法:

 HttpRuntime.Cache.Insert(this.CreateKey(protocolType, serverType), value, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); 

注意,這是明確設置緩存項永不過期,從不可拆卸的。我想這就是修補程序爲解決問題而改變的 - 不再有自動緩存刷新功能。

現在,在遇到此問題的應用程序中,我們有一些代碼可以在某些情況下手動清除ASP.NET緩存中的所有內容。我認爲這就是我們看到這個問題的原因:儘管修復程序停止了ASP.NET緩存自動從緩存中清除這些程序集,但我們的代碼正在進行並手動清除緩存。

我想知道您的應用程序(或其任何第三方組件)是否正在使用可能會刪除這些項目的緩存?