我正在運行一個大的ASP.net 4.0網站。它使用流行的.Net內容管理系統,擁有數千個內容項,數百個併發用戶 - 基本上是一個沉重的網站。使用RedGate Memory Profiler瞭解ASP.net中的內存泄漏
在1天的過程中,IIS7工作進程的內存使用量可能會增加到8-10GB。該服務器已安裝16GB,並且目前每天都設置爲回收應用程序池一次。
我受到壓力以減少內存使用量。大部分內存使用量都是由於緩存大量數據 - 但緩存時間間隔僅設置爲5-10分鐘 - 因此這些字符串最終應該從內存中過期。
但是在運行RedGate Memory Profiler之後,我可以看到我認爲是內存泄漏。我已經通過「僅由存儲對象保存在內存中」的對象(我在RedGate論壇上閱讀過,這是如何發現內存泄漏)過濾了我的實例列表結果。這給了我很長的內存中保存的字符串列表。
對於每個字符串,我使用實例保留圖來查看內存中的內容。 System.string對象似乎已被System.Web.Caching.CacheDependency緩存。如果我一直遵循圖形,它會經歷各種其他類,包括System.Collections.Specialized.ListDictionary,直到它到達System.Web.FileMonitor。這是有道理的,因爲字符串是文件的路徑(圖像/ PDF /等)。
看來,CMS正在緩存文件路徑,但這些緩存的對象然後「泄漏」。隨着時間的推移,這會增加並消耗RAM。
對不起,這是漫長的...有沒有辦法讓我停止這些內存泄漏?或者在不訴諸回收應用程序池的情況下清除它們?我可以找到什麼類/代碼正在做緩存,看看我是否可以修復泄漏?
我們已經在回收應用程序池,但客戶將此視爲一種解決方法,而不是解決方案。他們有理由說,應用程序不應該使用太多的內存。 – 2013-02-20 13:18:40
'System.Web.Caching.CacheDependency'相當於ASP.NET緩存的使用,而不是會話中的緩存。除非緩存鍵是用戶特定的(完全不推薦並且可能導致這些類型的問題),否則此緩存在某種程度上是靜態的並且爲所有用戶共享。回收池或降低會話超時只會限制Web應用的生命週期,而不會限制內存使用。 – JoeBilly 2013-08-07 13:55:42