
我們在兩台伺服器(IIS8 和 10)上運行 IIS,最近我們的 ASP.NET WebForms 應用程式的記憶體使用率非常高,大部分是透過 aspx 頁面存取的。
發生的情況是,隨著時間的推移,我們的應用程式集區消耗越來越多的內存,直到伺服器上的實體記憶體(64GB)幾乎耗盡。這絕對不正常。
我們試圖找出為什麼會發生這種情況,但沒有想法。目前尚不清楚這是我們應用程式中的記憶體洩漏還是正常行為,因此也許有人可以對此進行一些說明。
事實:
隨著時間的推移,應用程式集區保留並使用越來越多的內存,這些內存沒有被釋放(任務管理器說工作集和提交大小都非常高,所以它實際上被使用/保留,對吧? )
ANTS、.dotMemory、.NET MemoryProfiler 等內存分析器表示託管內存消耗相當低,例如 20-200MB,並且顯示大量非託管內存,這些內存將被使用,但免費。
即使使用快照和詳細的分析方法,它們也沒有給出任何可能導致非託管使用的提示。
如果我們用F5鍵「敲擊」起始頁而不釋放它,我們可以在一分鐘內將記憶體使用量提高到2-5GB。這有點瘋狂。
我們知道 IIS/應用程式集區傾向於以機會主義的方式保留內存,可用內存越多,但這太多了。
我們唯一看到的是,首頁似乎與它的控制項和 ComponentModel 物件一起保存在記憶體中,但是記憶體分析器中的任何位置都沒有對任何頁面物件或自己的命名空間類別的單一引用。
據傳聞,一年前記憶體消耗還不錯,總共停止在 2-3 GB,但我們無法再使用舊版本的應用程式來重現它。
在 WIN10 下本地全新安裝 IIS 時也會出現這種情況。
應用程式是在發布模式下建構的,經過最佳化,目前編譯成單一 DLL,也嘗試過不使用,追蹤標誌打開,大小 5mb
看來我們需要將應用程式拆開,將其分成幾個模組,然後看看它們的行為如何。在運行時載入的程序集/庫可以,但不應該成為問題。我們實際上並沒有引用那麼多(FreeTextBox、Microsoft ReportViewer、SharpCompress、Crystal Reports、AjaxControlToolKit 15),我們已經刪除了除 CrystalReports/AjaxControlToolKit 之外的所有內容,以查看會發生什麼,但沒有改變。
我們也使用許多 WebForms 控件,有時包括 Timers 和 UpdatePanel。
我們也不知道如何使用記憶體分析器找到罪魁禍首,假設存在一個隱藏的引用,導致一個或多個 aspx 頁面保留在記憶體中,因為 .NET 類別實例從不顯示任何指向任何內容的連結。
我們很高興收到有關內存預留或如何解決此內存消耗問題的任何提示。
非常感謝您的寶貴時間!
編輯(忘了提及): - 我們將GC.Collect/WaitForPendingFinalizers/GC.Collect 添加到起始頁的Page_Load 函數中,看看它是否有幫助,它確實有一段時間或一點點有幫助,直到有另一個壓力記憶體使用量再次以極端方式上升的情況(使用 F5)。
答案1
當 GC.WaitForPendingFinalizers 有幫助時,它可能是線程使用記憶體的標誌。如果在 page_load 上啟動一個新的單獨線程,它可能會使用大量記憶體。透過檢查任務管理器中的執行緒數開始診斷問題。