【问题标题】:ASP.Net Application pool memory leakASP.Net 应用程序池内存泄漏
【发布时间】:2015-07-02 18:49:22
【问题描述】:

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

【问题讨论】:

  • 如果你将你的 cn/cm/dr 包裹在 using 语句中,它会更容易使用,它会为你完成所有花哨的事情,比如在异常后关闭/处理。另外,如果您告诉它返回单个结果,为什么要使用 while 循环?将while 更改为if... 并不是说​​这些是您的问题,但它会清理您的代码。
  • 我的猜测是你的 blah,blah,blah 抛出异常,并且 finally 块在尝试处理未关闭的 dr 时也会崩溃。让所有对象保持打开状态并取消垃圾收集
  • 先学习 .NET 内存模型,你就不会这么惊讶了。
  • @Ewan 无论您是否致电Dispose,都会收集垃圾。这不是Dispose 的目的。
  • 我希望你的真实代码中的 catch 块不是空的。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2011-10-29
    • 2016-03-28
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多