发现内存泄漏?

时间:2011-10-27 14:04:32

标签: c# memory-leaks

简单地说,当我的服务使用它时,我的sqlservr.exe是内存泄漏。所以问题是,在哪里以及为什么! :(

我将我的连接初始化为空值。并有一个finally子句,以确保它们被关闭...(我也试过。在datareader上设置,但没有帮助)。

我已经尝试过一天以上的问题。我所能说的就是它在某处。

private Int32 GetCount(String From, String Where)
{

    //Build SQL string from given parameters.
    String sql = "SET dateformat DMY SELECT COUNT(*) as Count FROM " + From + " WHERE " + Where;
    SqlDataReader dataCount = null;
    SqlCommand sqlCommCount = null;
    SqlConnection sqlConCount = null;
    try
    {
        sqlCommCount = new SqlCommand();
        sqlConCount = new SqlConnection();
        sqlCommCount.Connection = sqlConCount;
        sqlConCount.ConnectionString = "connectionstring";
        sqlCommCount.CommandText = sql;
        sqlConCount.Open();

        dataCount = sqlCommCount.ExecuteReader();
        while (dataCount.Read())
        {
            return Convert.ToInt32(dataCount["Count"]);
        }
        return 0;
    }
    finally
    {
        sqlConCount.Close();
        sqlCommCount.Dispose();
        if (dataCount != null)
            dataCount.Close();

    }
}

解决:

  1. 没有泄漏。

  2. 我讨厌Sqlserver没有告诉我它缓存了连接时没有使用的内存,所以只是增加和增加(直到需要它为止)。

4 个答案:

答案 0 :(得分:2)

使用以下关键字重构您的代码:使用

内存占用不是确定性的,在你的示例中,只有当垃圾收集发生时才会释放可执行文件使用的有效内存,因此你可以看到内存增加,但这可能不是问题,它将被收集迟早和记忆将恢复到正确的值。

看到评论后,问题似乎不在你的C#代码中(如果使用using关键字,这也是个好主意!),如果有问题......

SQL Server将增加内存占用,直到它有可用内存,它的设计就是这样。在每次传递一个新的where子句时,它会缓存SQL语句,因此内存使用量会增加,直到你有可用内存为止。

在这种情况下,我建议你重构代码,至少使用SQL参数来创建where子句,这样SQL将始终保持不变,只有参数发生变化,这样SQL服务器只会缓存一个SQL语句,不是千万。更好的是创建一个存储过程,但参数通常就足够了。

请记住,构建SQL语句的方式实际上是不安全的,并且可能导致SQL注入攻击,使用参数也会解决这个问题。

此致

的Massimo

答案 1 :(得分:0)

您的Conenction sqlConCount 永远不会被处理掉。

SqlConnection的Dispose实现在处理之前关闭连接。所以最好是使用using命令进行连接,你可以确定问题不会在那里。

但是因为你不保存引用它应该是垃圾收集,所以不是真正的问题。你100%确定内存泄漏在这里吗?

答案 2 :(得分:0)

看起来你要在finally块有机会触发之前返回你的整数。尝试在try块中分配它并在finally块

之后返回它
int value = o;
try
{
  ... 
  value = Convert.ToInt32(dataCount["Count"]);
}
finally
{
//close connection
}
return value;

答案 3 :(得分:-2)

我认为string + string导致泄漏,切换到StringBuilder。您也没有处置SqlConCountdataCount(您可以尝试使用using重构代码