【发布时间】: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