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

本文关键字:内存 泄漏 程序池 应用程序 Net 应用 ASP | 更新日期: 2023-09-27 18:01:00

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

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

您正在处理所有的一次性对象,这很好。在这种情况下,最好使用"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();