ASP.Net应用程序池内存泄漏

时间:2015-07-02 18:49:22

标签: c# .net memory-leaks garbage-collection pool

ASP.Net中存在“内存泄漏”问题。 我创建了一个与数据库建立连接的空白页面。 访问页面时内存会增加,并且不会立即恢复正常!最高峰值内存介于1GB!之后,我必须回收IIS中的“池”... 我使用Connection.Close()和connection.Dispose()方法,但似乎它们确实有效。 我在网上搜索的更多灵魂无法找到。

有没有办法解决这个问题,而无需回收池? 感谢分享知识!!!

这是发生内存泄漏的块:

    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();
    }

1 个答案:

答案 0 :(得分:0)

您正在处理好的所有一次性物品。最好使用' using'而不是在这种情况下最终。通过查看您提供的代码,看不出任何导致内存泄漏的原因。

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();