我正在使用SQL Server數據存儲頂部的ASP.NET 4.5(C#/ WebForms)構建管理網站,這需要我檢索大型記錄集(250K +記錄)。在開發中,在IIS Express上,我一直收到Out of Memory(OOM)源自IIS的異常。我可以看看任務管理器,並觀察內存使用率從12萬到峯值超過600,000K。在執行大型查詢後在IIS中清除內存
我遇到的問題(其他問題)是當我返回並過濾查詢以便它不會返回儘可能多的記錄時,我繼續得到OOM異常,因爲IIS不會從先前釋放內存查詢。新查詢所需的內存只是堆積在已分配的內存之上。
在一個完整的IIS 7的安裝(仍然在我的dev的盒子)我沒有得到從IIS最初的OOM異常,但它是仍然不釋放內存,這將繼續造成對未來IIS活動的問題內存繼續堆積。我明白GC應該最終清理它,但我需要它立即發生。
所以問題是我如何從IIS中釋放未使用但尚未分配的內存?
我發現下面的文章SF ...
害得我嘗試以下...
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
附:這種大型記錄集的原因是因爲企業希望能夠將數據導出到Excel電子表格中,所以結果的簡單分頁不一定是一種選擇。查詢執行時也有相當長的延遲,因此不得不忍受每個頁面的執行時間。我有關於性能調優這個查詢的問題,但顯然超出了這個問題的範圍。
您可以閱讀這篇文章。 http://stackoverflow.com/questions/9666356/high-memory-usage-with-w3wp-application-pool-iis-7 –
如果沒有引用,內存將被釋放。這表明一個錯誤或一個誤解。另外,OOM不是來自IIS。當你的內存已經耗盡時,它來自CLR。發佈更多的代碼並切換到64位。 – usr