gpt4 book ai didi

.net - .NET SqlConnection 和 DataSet 的内存泄漏

转载 作者:行者123 更新时间:2023-12-01 13:05:28 24 4
gpt4 key购买 nike

我在运行 SQL 脚本并将结果转储到文件的服务程序中遇到内存泄漏问题。在运行产生许多结果行的查询后,进程的内存使用量每次都会增加 50+ MB,而且不会下降。

这是打开连接并检索结果的代码:

using (var conn = new SqlConnection(DataSourceInfo.ConnectionString))
{
conn.Open();

var scmd = new SqlCommand(query_string, conn);
scmd.CommandTimeout = 86400;

var writer = dest.GetStream(); //the writer is disposed of elsewhere

using (var da = new SqlDataAdapter(scmd))
using (var ds = new DataSet())
{
da.Fill(ds);
var table = ds.Tables[0];
var rows = table.Rows;

if (TaskInfo.IncludeColNames.Value)
{
object[] cols = new object[table.Columns.Count];

for(int i = 0; i < table.Columns.Count; i++)
cols[i] = table.Columns[i];

LineFormatter(writer, TaskInfo.FieldDelimiter, null, false, cols);
writer.WriteLine();
}

foreach(System.Data.DataRow r in rows)
{
var fields = r.ItemArray;

LineFormatter(writer, TaskInfo.FieldDelimiter, TaskInfo.TextQualifier, TaskInfo.TrimFields.Value, fields);
writer.WriteLine();
}
}
}

我使用 WinDbg 和 sos.dll 在执行完成后按类型列出排名靠前的对象,并且进程有足够的时间进行 GC:

79333470      101       166476 System.Byte[]
65245dcc 177 3897420 System.Data.RBTree`1+Node[[System.Data.DataRow, System.Data]][]
0015e680 5560 3968936 Free
79332b9c 342 3997304 System.Int32[]
6524508c 120349 7702336 System.Data.DataRow
793041d0 984 22171736 System.Object[]
7993bec4 70 63341660 System.Decimal[]
79330a00 2203630 74522604 System.String

第二列是对象数量,第三列是总大小。

不应有任何未完成的 System.Data.DataRow 对象。看起来它们正在以某种方式泄露,但我不确定是如何泄露的。

我做错了什么?

注意:以前的版本使用 SqlDataReader 来检索行数据,但该方法缺少获取列标题的方法(据我所知),并且在 DataSet 和 SqlDatReader 之间共享数据集会在某些查询中默默地失败。我不记得那个版本有内存泄漏问题。

最佳答案

除非 LineFormatter 正在做一些事情来在程序的生命周期中保留引用,否则我看不出这里有什么问题。

您正在对垃圾收集器的工作方式做出一些重大假设。 AFAIK,它基于内存压力而不是时间工作。如果您感觉真的很偏执,您可以在代码中运行 GC.Collect() 并查看这是否会降低内存使用量,但我绝不会在生产代码中调用 GC.Collect() —— 只是将其作为测试.

还要确保您没有依赖任务管理器来告诉您在 .NET 堆中保留了多少内存。您应该改为查看 performance counters in PerfMon检查托管世界中发生的事情。

关于.net - .NET SqlConnection 和 DataSet 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3409987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com