簡體   English   中英

執行大型查詢后在IIS中清除內存

[英]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中釋放未使用但尚未分配的內存?

我發現了以下科幻文章...

  1. IIS中的內存不足異常
  2. 從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM