【问题标题】:ASP.Net/SQL: After cancelling query the memory isn't decreasing (DataBoundControl.PerformSelect)ASP.Net/SQL:取消查询后内存没有减少(DataBoundControl.PerformSelect)
【发布时间】:2011-02-23 14:01:32
【问题描述】:

在 asp.net 2.0 生产环境中,我们有一个 aspx 可以查询 SQL2005 数据库的所有类型的查询。有些查询需要一段时间,所以我们添加了一个取消按钮。

在代码中,我们打开连接,然后调用 command.ExecuteReader()。我们将它绑定到一个gridview。

在取消按钮点击我们调用command.Cancel(),处理命令、连接和datareader。并关闭连接。

代码执行后,我在 SQL 分析器中看到查询被取消。但是 w3wp.exe 仍然占用大量内存。

为了测试它,我编写了一个返回大量数据的查询。在 2 秒内我取消了它,我看到内存从 250Mb 增加到几乎 2Gb。一段时间后内存没有减少。

我使用 JetBrains dotTrace Memory 3.5 查看内存的情况。我看到的是 66.6% 的内存正在被 DataBoundControl.PerformSelect 使用。微软表示“在检索数据后调用 PerformDataBinding 方法将数据绑定到数据绑定控件的元素。”但并非所有数据都被检索到,呼叫被取消。发生了什么,为什么没有释放内存?

任何人知道发生了什么或/以及如何解决这个问题?

【问题讨论】:

    标签: c# asp.net sql-server-2005 ado.net memory-leaks


    【解决方案1】:

    仅仅因为你释放了一个资源并不意味着框架会归还内存。事实上,服务器版本的框架会保留分配的内存空间供以后重用。

    How the garbage collection works in .NET

    A very useful blog for understanding the internals of garbage collection and performance

    From the same blog, see the block after the third note.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      相关资源
      最近更新 更多