【问题标题】:Memory Leak with Strongly Typed TableAdapter强类型 TableAdapter 的内存泄漏
【发布时间】:2015-02-11 23:59:19
【问题描述】:

考虑以下示例代码:

Dim ta as new LogsTableAdapter
Dim lstLogs as new List(of LogsRow)
lstLogs.AddRange(ta.GetData.ToList)
ta.Dispose
ta = nothing
lstLogs.clear
lstLogs = nothing
GC.Collect
GC.WaitForFullGCComplete()
GC.Collect

在执行此代码后,使用 windbg,我可以看到所有 LogsRow 对象以及表示这些对象的字段的对象(字符串、整数小数等)仍然驻留在内存中。还有一个 LogsDataTable 驻留在内存中。

我知道 ta.GetData() 返回一个数据表。但由于我将其转换为一个列表,然后将其添加到另一个列表中,因此我的方法似乎是将数据表及其所有行留在内存中。

此外,清除列表并将其清空,似乎并没有释放列表及其中的对象所占用的资源。

那么这里到底发生了什么,我该如何释放这些资源?

【问题讨论】:

  • 尝试用不同的方法创建/处理。我认为您需要不同的范围才能让 GC 完全清理这些东西。当前范围在您的示例中仍然有效。不过,我可能是大错特错......
  • 哦,好电话。这很可能是真的。

标签: vb.net visual-studio-2012 memory-leaks datatable .net-4.0


【解决方案1】:

感谢 TyCobb 的评论,我将列表初始化代码移至不同的方法,并重组为使用 .Fill 而不是 .GetData() ,在调用该方法后,我手动执行垃圾收集,并且可以看到内存正在被正确释放。

这是我现在在单独的子目录中填写列表的方式:

Using taFiles As New dsIBETTableAdapters.tblInfoDataTableAdapter With {.Connection = IbetConn}
    Using dtFiles As New dsIBET.tblInfoDataDataTable
        taFiles.Fill(dtFiles)
        lstFiles.AddRange(dtFiles.ToList)
    End Using
End Using

【讨论】:

    猜你喜欢
    • 2010-12-18
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多