[英]Clearing Memory in IIS after executing large queries
我正在使用SQL Server數據存儲區頂部的ASP.NET 4.5(C#/ WebForms)構建的管理站點上工作,這需要我檢索大型記錄集(250K +記錄)。 在開發中,在IIS Express上,我始終收到源自IIS的內存不足 (OOM)異常。 我可以查看任務管理器,觀察內存使用量從120,000K飆升至600,000K以上。
我遇到的問題(另一個問題)是,當我返回並過濾查詢時,它不會返回盡可能多的記錄,我繼續遇到OOM異常,因為IIS並未從前一個查詢中釋放內存。 新查詢所需的內存僅堆積在已分配的內存之上。
在完整的IIS 7安裝上(仍在我的DEV框上),我沒有從IIS得到初始OOM異常,但是它仍然沒有釋放內存,隨着內存繼續堆積,這將繼續為將來的IIS活動造成問題。 。 我知道GC最終應該解決它,但我需要立即進行。
因此,問題是如何按需從IIS中釋放未使用但尚未分配的內存?
我發現了以下科幻文章...
這導致我嘗試以下方法...
protected override void OnPreRender(EventArgs e)
{
try
{
var data = this.GetSessionList();
BindUI(data);
}
catch (Exception ex)
{
//
// display error message
while (ex.InnerException != null) { ex = ex.InnerException; }
String msg = (ex.GetType() == typeof(OutOfMemoryException)) ? MessagesConfigService.OutOfMemory.SessionReports : ex.Message;
ucAlert.ShowMessage(msg, ucAlertMessage.AlertStates.DANGER);
}
finally
{
//
// Clean up anything being held on to in memory. This will not prevent OOM
// exceptions for too-large queries, but will prevent further OOM errors for
// smaller queries that follow.
GC.Collect();
Int64 totalMemory = GC.GetTotalMemory(true);
}
base.OnPreRender(e);
}
在finally子句中,我分別嘗試了每種GC方法以及將它們一起使用,但沒有發現IIS占用的內存減少。
我原本沒有考慮過的另一件事,但是當我鍵入此內容時,意識到這一點很重要...我需要清除內存,但保留會話狀態...因此,無論解決方案是什么,都不能消除會話狀態,將導致用戶必須重新登錄。
那么...有什么想法嗎?
先感謝您 :)
-G
PS之所以使用如此大的記錄集,是因為該公司希望能夠將數據導出到Excel電子表格中,因此,簡單地分頁結果不一定是一種選擇。 此外,由於查詢執行時存在大量延遲,因此必須忍受每個頁面的執行時間是過高的。 我對查詢的性能調優有疑問,但顯然不在此問題范圍之內。
您將要嘗試使用應用程序池的回收設置和虛擬內存限制。 這個問題沒有答案。 它涉及熟悉這些設置並在負載下嘗試不同的設置。
在此處查看“ 優化應用程序池”部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.