DataTable内存泄漏

3

即使数据库没有返回任何数据,下面的代码仍然会泄漏内存。能否有人解释一下这是为什么?.net性能分析器显示罪魁祸首是DataTable。

using (OleDbDataAdapter da = new OleDbDataAdapter("select * from external_message where status='P' and pendingthread=" + Thread.CurrentThread.ManagedThreadId, conn))
                {
                    DataTable dt = new DataTable();
                    da.Fill(dt);
                    if (dt.Rows.Count > 0)
                    {
                        DataRow dr = dt.Rows[0];
                        NotificationService.Logger.Write(Logger.RdvLogLevel.Debug, (uint)Thread.CurrentThread.ManagedThreadId, "GetInputs", "Received Message Id {0} Type {1}", dr["MessageId"].ToString(), dr.Field<string>("TargetType"));
                        return new DatabaseItem { connection = conn, dataRow = dr };
                    }
                    else
                    {
                        dt.Dispose();
                    }
                }
3个回答

4

可能以下代码会导致内存泄漏。您需要释放数据库连接,因为它们持有一些非托管数据。

return new DatabaseItem { connection = conn, dataRow = dr };

如果即使没有返回数据也会泄漏内存,请确保调用conn 的 Dispose方法?您必须始终处理数据库连接。


即使数据库没有返回任何数据,仍会出现内存泄漏。 - BrokenGlass
@BrokenGlass:感谢您指出这一点。可能是因为没有调用conn.Dispose()。 - CharithJ
连接在父方法中已关闭。我只是返回此连接以重用已打开的连接。 - Mubashir Khan
@MubashirKhan:我不确定父方法中发生了什么。需要记住的是,当您不需要连接时,必须Dispose它。关闭是不够的。 - CharithJ
DataTable泄漏内存而不是连接。我在父方法中处理了连接。我正在等待开始悬赏,并已向Microsoft报告以寻求帮助 https://connect.microsoft.com/VisualStudio/feedback/details/693522/datatable-memory-leak-in-windows-service http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/5e62af05-37a9-4ea7-b223-124d957f236f - Mubashir Khan

0

[STAThread]在Main函数上引起了问题。将其移除后,现在一切都正常工作。


0

我认为这不是一个泄漏。这些对象会一直占用资源,直到被垃圾回收。你的dt.Dispose()会提示垃圾回收器你的对象不再需要了,但是.Net只有在它觉得需要的时候才会清理它。

你可以通过调用GC.Collect()来促使垃圾回收器运行,但通常情况下你应该让.Net自己清理。


我有一个 .NET 分析器应用程序。每当 GC 被调用时,它都会显示数据。内存不断增长,根引用也不断增加。如果我注释掉上面的代码,这种情况就不会发生。分析器显示 DataTable 构造函数中初始化的 ReaderWriterLock 的终结器被卡住了,并且在 GC 队列中有很多此类型的对象永远不会被收集。 - Mubashir Khan
你尝试过在 da.Fill 中填充 DataSet,然后获取生成的 DataTable 吗? - Joe Mancuso
同样的代码在控制台应用程序中可以正常工作,但在 Windows 服务中会泄漏内存。请注意,此代码是在单独的线程中编写的。 - Mubashir Khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接