簡體   English   中英

ASP.Net 應用程序池內存泄漏

[英]ASP.Net Application pool memory leak

我在 ASP.Net 中遇到了“內存泄漏”問題。 我創建了一個與數據庫建立連接的空白頁面。 內存在訪問頁面時增加並且不會立即恢復正常! 最高峰值內存在 1GB 之間!,然后我必須回收 IIS 中的“池”......我使用方法 Connection.Close() 和 connection.Dispose(),但似乎它們確實有效。 我在網上搜索了更多的soulção 找不到。

有沒有什么辦法可以解決這個問題而不必回收池? 感謝分享知識!!!

這是發生內存泄漏的塊:

    SqlConnection cn = new SqlConnection("");
    SqlCommand cm = new SqlCommand();

    SqlDataReader dr = null;

    try
    {
        cn.Open();
        cm.Connection = cn;
        cm.CommandTimeout = 600;
        cm.CommandText = "";

        cm.Parameters.Add("operation", SqlDbType.Int).Value = 1;
        cm.Parameters.Add("now", SqlDbType.DateTime).Value = DateTime.Now;

        dr = cm.ExecuteReader(CommandBehavior.SingleResult);
        while (dr.Read())
        {
            //blah blah blah...
        }
        dr.Close();
    }
    catch (Exception ex)
    {

    }
    finally
    {
        if (dr != null)
            dr.Dispose();

        cm.Dispose();

        cn.Close();
        cn.Dispose();
    }

您正在處理所有好的一次性物品。 在這種情況下,最好使用 ' using ' 而不是 finally 。 通過查看您提供的代碼無法發現內存泄漏的任何原因。

using (SqlConnection cn = new SqlConnection(""))
using (SqlCommand cm = new SqlCommand())
{
    .....

     using (var dr = cm.ExecuteReader(CommandBehavior.SingleResult))
     {
        while (dr.Read())
        {
            //blah blah blah...
        }
     }
}

請記住,垃圾收集不會在任何實例處置后立即釋放內存。

它已被優化為僅在存在內存壓力時觸發和釋放內存。 因此,如果您想測試內存泄漏,您應該在獲取內存使用讀數之前手動執行垃圾收集。

GC.Collect();
GC.WaitForPendingFinalizers();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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