2013-02-20 76 views
6

我正在運行一個大的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。

對不起,這是漫長的...有沒有辦法讓我停止這些內存泄漏?或者在不訴諸回收應用程序池的情況下清除它們?我可以找到什麼類/代碼正在做緩存,看看我是否可以修復泄漏?

回答

0

這聽起來像東西作爲會話狀態的一部分留在內存中的常見問題。如果是這樣,你的唯一選擇是1.不要在每個用戶的會話中放置太多東西,2.將會話生存期設置爲更短的時間(我認爲默認值是20分鐘),以及3.定期回收應用程序池。

作爲1的一部分。我發現在數據網格控件中呈現數據有「好方法」和「壞方法」。您可能需要檢查您是否只複製了您需要的數據,而不是意外地保持對整個數據網格的引用。

+0

我們已經在回收應用程序池,但客戶將此視爲一種解決方法,而不是解決方案。他們有理由說,應用程序不應該使用太多的內存。 – 2013-02-20 13:18:40

+0

'System.Web.Caching.CacheDependency'相當於ASP.NET緩存的使用,而不是會話中的緩存。除非緩存鍵是用戶特定的(完全不推薦並且可能導致這些類型的問題),否則此緩存在某種程度上是靜態的並且爲所有用戶共享。回收池或降低會話超時只會限制Web應用的生命週期,而不會限制內存使用。 – JoeBilly 2013-08-07 13:55:42