2016-04-21 18 views
0

我正在使用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 ...

  1. Out Of Memory Exception in IIS
  2. Cleaning up Large Objects from IIS memory

害得我嘗試以下...

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電子表格中,所以結果的簡單分頁不一定是一種選擇。查詢執行時也有相當長的延遲,因此不得不忍受每個頁面的執行時間。我有關於性能調優這個查詢的問題,但顯然超出了這個問題的範圍。

+0

您可以閱讀這篇文章。 http://stackoverflow.com/questions/9666356/high-memory-usage-with-w3wp-application-pool-iis-7 –

+0

如果沒有引用,內存將被釋放。這表明一個錯誤或一個誤解。另外,OOM不是來自IIS。當你的內存已經耗盡時,它來自CLR。發佈更多的代碼並切換到64位。 – usr

回答

0

您將要試驗應用程序池的回收設置和虛擬內存限制。沒有人回答這個問題。它涉及熟悉這些設置並在負載下嘗試不同的設置。

檢出調整應用程序池部分here

+0

回收應用程序池將重置所有連接的用戶的會話狀態,但對嗎? - 另外,這是生活在一個「網站」中的幾個應用程序之一,因此使用相同的AppPool ...所以這也可能會影響到這些應用程序。 –

+0

在回收設置中,您可以分別控制虛擬內存和專用內存。因此,它只能在達到所需的最大內存限制時回收單個w3wp線程。而且你可以拖延時間,以便任何使用該線程的用戶有時間完成他們的工作。 –