繁体   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