【发布时间】:2016-07-17 23:14:45
【问题描述】:
我了解您需要在完成后调用SqlConnection 对象上的.Close() 以将底层SQL 连接释放回池;但如果您不这样做,即使超出范围,.NET 对象是否仍保留在内存中?我之所以问,是因为我正在处理一些遇到内存泄漏的代码,并且我注意到 SqlConnection 对象没有被关闭或处置(它们被创建、打开,然后只是被允许超出范围)。
【问题讨论】:
-
它们不仅应该被关闭,而且应该被处理掉。将它们包裹在使用块中。没有它们,它们分配的句柄等资源就不会被释放;所以这很可能不是 memory 泄漏的原因。处理任何具有
Dispose方法的东西。您还可以在项目上运行 CA 以查找实际的内存泄漏 -
如果一个类实现了
IDisposable,那么这很好地表明你需要Dispose()它 -
即使未正确处理非托管资源,与打开的连接关联的 .NET 对象在超出范围后是否仍会被垃圾收集?
-
.NET 对象在超出范围时不会立即进行 GC(除非您使用的是
using,这并不完全相同)。它不像 c/c++。在此之前,有一个昂贵的非托管资源处于打开状态,这可能会导致数据库连接耗尽
标签: .net memory-leaks ado.net sqlconnection